Bonita Montero
unread,Sep 19, 2021, 7:33:19 AM9/19/21You do not have permission to delete messages in this group
Sign in to report message
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to
Look at this code:
#include <concepts>
using namespace std;
struct A
{
void op();
};
struct B
{
void op( bool );
};
template<typename T>
concept concept_C = is_same<T, A>::value || is_same<T, B>::value;
template<typename T>
requires concept_C<T>
struct C
{
void opA()
requires is_same<T, A>::value;
void opB( bool f )
requires is_same<T, B>::value;
T *pt;
};
template<typename T>
requires concept_C<T>
void C<T>::opA()
requires is_same<T, A>::value
{
pt->op();
}
template<typename T>
requires concept_C<T>
void C<T>::opB( bool f )
requires is_same<T, B>::value
{
pt->op( f );
}
template
struct C<A>;
template
struct C<B>;
MSVC will instantiate opA for A as well as B and opB
also for A as well as B and gives the following errors:
(42,10): error : too many arguments to function call, expected 0, have 1
(46,8): message : in instantiation of member function 'C<A>::opB'
requested here
(7,7): message : 'op' declared here
(34,9): error : too few arguments to function call, expected 1, have 0
(49,8): message : in instantiation of member function 'C<B>::opA'
requested here
(12,7): message : 'op' declared here
clang gives similar errors, but g++12 is smarter and skips inappropriate
compilation, i.e. filters the functions through their concepts, i.e. it
compiles opA only for A and opB only for B - so which compiler is right
here ? And is there a workaround ?