--What is exactly the difference that makes the second sample fail to compile?Hello,
With MSVC, the following code compiles. The
charoverload is selected by overload resolution.struct S { operator int() const & { return 0; } operator char() && { return 0; } }; void foo(int) {} void foo(char) {} int main() { foo(S{}); //OK, calls 'void foo(char)'. }However, the following code won't compile.
struct S { int i = 0; operator const int &() const & { return i; } operator int &&() && { return (int &&)(i); } }; void foo(const int &) {} void foo(int &&) {} int main() { foo(S{}); //error C2668: 'foo': ambiguous call to overloaded function //message : could be 'void foo(int &&)' //message : or 'void foo(const int &)' }
Given that'operator int &&() &&'is an exact match to the conversion required to call'void foo(int &&)', I expected the compiler to select it. It is strange if the C++ rules will not allow the compiler to select a conversion function that exactly matches the required conversion, both in terms of the provided argument 'S &&' and the result of conversion 'int &&'.
Std-Discussion mailing list
Std-Discussion@lists.isocpp.org
https://lists.isocpp.org/mailman/listinfo.cgi/std-discussion