C++ Logo

STD-DISCUSSION

Advanced search

Subject: Why does overload resolution fail in this simple case?
From: Hani Deek (hani_deek_at_[hidden])
Date: 2020-12-29 15:04:34


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 list run by std-discussion-owner@lists.isocpp.org

Older Archives on Google Groups