https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113007
Bug ID: 113007
Summary: `std::variant` converting constructor and `operator=`
compile while the C++ Standard says they must not
Product: gcc
Version: 13.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: paul.skeptic at yandex dot ru
Target Milestone: ---
According to [variant.ctor] (https://eel.is/c++draft/variant.ctor, also see
https://en.cppreference.com/w/cpp/utility/variant/variant) converting
constructor
template<class T>
constexpr variant(T&& t) noexcept(/*...*/);
determines the alternative to construct as if by selecting an overload for
`F(std::forward<T>(t))` from an overload set `F(T_j)` where `T_j` are types
of the alternatives,
e.g. for `std::variant<std::monostate, bool, int64_t, double>` the overload set
would be
void F(std::monostate) {}
void F(bool) {}
void F(int64_t) {}
void F(double) {}
In violation of the standard this code compiles with GCC and libstdc++
(https://godbolt.org/z/fd8xa1bqM):
std::variant<std::monostate, bool, int64_t, double> v = 42;
while overload resolution of `F()` fails:
F(42); // error: ambiguous confused_john_travolta.gif
Compiler output:
<source>: In function 'int main()':
<source>:14:4: error: call of overloaded 'F(int)' is ambiguous
14 | F(42);
| ~^~~~
<source>:6:6: note: candidate: 'void F(bool)'
6 | void F(bool) {}
| ^
<source>:7:6: note: candidate: 'void F(int64_t)'
7 | void F(int64_t) {}
| ^
<source>:8:6: note: candidate: 'void F(double)'
8 | void F(double) {}
| ^
Also the same applies to converting assignment operator
template<class T>
constexpr variant& operator=(T&& t) noexcept(/*...*/);
see [variant.assign] (https://eel.is/c++draft/variant.assign, also
https://en.cppreference.com/w/cpp/utility/variant/operator%3D).
Among libc++, libstdc++ and MSVC standard libraries only MSVC standard library
gets it according to the standard so you can look at it for reference.
See corresponding bug for libc++:
https://github.com/llvm/llvm-project/issues/75323