Quantcast
Channel: Recent Questions - Stack Overflow
Viewing all articles
Browse latest Browse all 12111

Why does this operator overload compile in MSVC and GCC but not Clang?

$
0
0

The following code compiles with MSVC (/std:c++latest) and GCC (-std=c++2c), but not Clang (-std=c++2c). Compiler Explorer demo here.

#include <type_traits>struct A{    A(int set_value) : _value{set_value}    {    }    template <typename other>        requires std::is_arithmetic<other>::value    operator other() const    {        return other(_value);    }    A operator*(const A &rhs) const    {        return _value * rhs._value;    }    int _value = 0;};int main(){    (void)(A(3) * -1);}

Which compiler(s) are handling this code correctly? What is the preferred way to get this working under Clang?

Clang's output from Compiler Explorer:

<source>:26:17: error: use of overloaded operator '*' is ambiguous (with operand types 'A' and 'int')   26 |     (void)(A(3) * -1);      |            ~~~~ ^ ~~<source>:16:7: note: candidate function   16 |     A operator*(const A &rhs) const      |       ^<source>:26:17: note: built-in candidate operator*(float, int)   26 |     (void)(A(3) * -1);      |                 ^<source>:26:17: note: built-in candidate operator*(double, int)<source>:26:17: note: built-in candidate operator*(long double, int)<source>:26:17: note: built-in candidate operator*(int, int)[...many similar lines omitted...]<source>:26:17: note: built-in candidate operator*(unsigned long long, unsigned long)<source>:26:17: note: built-in candidate operator*(unsigned long long, unsigned long long)<source>:26:17: note: built-in candidate operator*(unsigned long long, unsigned __int128)1 error generated.Compiler returned: 1

(I am trying to create a strong_alias wrapper type which is interchangeable with primitive types, but not other strong_aliases.)


Viewing all articles
Browse latest Browse all 12111

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>