Date: Wed, 30 Dec 2020 19:21:35 +0000
The following example produces quite conflicting results https://godbolt.org/z/PExfM1.
It is accepted by msvc and icc, but rejected by gcc and clang. Because of these different results, in addition to the point made by Lénárd Szolnoki in his last message, I still do not know the correct answer to this whole issue.
enum A;
enum B;
struct S
{
operator A() &{ return A{}; }
operator B() &&{ return B{}; }
};
void foo(A) {}
void foo(B) {}
int main()
{
foo(S{});
}
________________________________
Hani Deek via Std-Discussion <std-discussion_at_[hidden]<mailto:std-discussion_at_[hidden]>>
Hello,
With MSVC, the following code compiles. The char overload 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 &)'
}
What is exactly the difference that makes the second sample fail to compile?
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 &&'.
It is accepted by msvc and icc, but rejected by gcc and clang. Because of these different results, in addition to the point made by Lénárd Szolnoki in his last message, I still do not know the correct answer to this whole issue.
enum A;
enum B;
struct S
{
operator A() &{ return A{}; }
operator B() &&{ return B{}; }
};
void foo(A) {}
void foo(B) {}
int main()
{
foo(S{});
}
________________________________
Hani Deek via Std-Discussion <std-discussion_at_[hidden]<mailto:std-discussion_at_[hidden]>>
Hello,
With MSVC, the following code compiles. The char overload 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 &)'
}
What is exactly the difference that makes the second sample fail to compile?
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_at_[hidden]<mailto:Std-Discussion_at_[hidden]> https://lists.isocpp.org/mailman/listinfo.cgi/std-discussion
Received on 2020-12-30 13:21:39