#include <iostream>
template < typename T, typename FT>
void test( const FT & ( T:: * ptr) ( ) const )
{
std:: cout << "const exists" << std:: endl ;
}
template < typename T, typename FT>
void test( FT & ( T:: * ptr) ( ) )
{
std:: cout << "non-const exists" << std:: endl ;
}
struct A {
const double & a( ) const { return a_; }
double & a( ) { return a_; }
private :
double a_;
} ;
struct B {
const double & b( ) const { return b_; }
private :
double b_;
} ;
int main( int argc, char ** argv )
{
test( & A:: a ) ;
test( & B:: b ) ;
return 0 ;
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRlQ+CiAgICB2b2lkIHRlc3QoIGNvbnN0IEZUICYgKFQ6OipwdHIpKCkgY29uc3QgKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiY29uc3QgZXhpc3RzIiA8PCBzdGQ6OmVuZGw7CiAgICB9CgogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEZUPgogICAgdm9pZCB0ZXN0KCBGVCAmIChUOjoqcHRyKSgpICkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIm5vbi1jb25zdCBleGlzdHMiIDw8IHN0ZDo6ZW5kbDsKICAgIH0KCgogICAgc3RydWN0IEEgewogICAgICAgIGNvbnN0IGRvdWJsZSAmIGEoKSBjb25zdCB7IHJldHVybiBhXzsgfQogICAgICAgIGRvdWJsZSAmIGEoKSB7IHJldHVybiBhXzsgfQoKICAgICAgICBwcml2YXRlOgogICAgICAgICAgICBkb3VibGUgYV87CiAgICB9OwoKICAgIHN0cnVjdCBCIHsKICAgICAgICBjb25zdCBkb3VibGUgJiBiKCkgY29uc3QgeyByZXR1cm4gYl87IH0KCiAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgZG91YmxlIGJfOwogICAgfTsKCgoKICAgIGludCBtYWluKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKQogICAgewogICAgICAgIHRlc3QoJkE6OmEpOwogICAgICAgIHRlc3QoJkI6OmIpOwoKICAgICAgICByZXR1cm4gMDsKICAgIH0K
compilation info
prog.cpp: In function ‘int main(int, char**)’:
prog.cpp:35: error: call of overloaded ‘test(<unresolved overloaded function type>)’ is ambiguous
prog.cpp:4: note: candidates are: void test(const FT& (T::*)()const) [with T = A, FT = double]
prog.cpp:10: note: void test(FT& (T::*)()) [with T = A, FT = double]
stdout