Template argument deduction for reference conversions do not deduce the correct type with respect to cv-qualifiers of the deduced A.
See N3290 subclause 14.8.2.3 [temp.deduct.conv]; the P/A pair used for type deduction in the case below would be T/const int.
Deduction should succeed with T = const int.
As the error message shows, the deduction produced "int" instead of "const int".
Extended Description
Template argument deduction for reference conversions do not deduce the correct type with respect to cv-qualifiers of the deduced A.
See N3290 subclause 14.8.2.3 [temp.deduct.conv]; the P/A pair used for type deduction in the case below would be T/const int. Deduction should succeed with T = const int.
As the error message shows, the deduction produced "int" instead of "const int".
SOURCE:
$ cat deduceTemplateConv.cc struct A { template operator T&() { static_assert(sizeof(T) == 0, ""); }
};
template <> A::operator const int &(void);
const int &x = A();
COMPILER INVOCATION AND OUTPUT:
$ clang -x c++ -std=c++11 deduceTemplateConv.cc deduceTemplateConv.cc:2:41: error: static_assert failed "" template operator T&() { static_assert(sizeof(T) == 0, ""); }
^ ' requested here
const int &x = A();
^
1 error generated.
~~~~~~ deduceTemplateConv.cc:6:16: note: in instantiation of function template specialization 'A::operator int &EXPECTED OUTPUT:
Successful compile.
COMPILER VERSION INFO:
$ clang++ -v clang version 3.6.0 (trunk 215824) Target: x86_64-unknown-linux-gnu Thread model: posix Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8.2 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9.0 Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8 Candidate multilib: .;@m64 Selected multilib: .;@m64