https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113219
Bug ID: 113219 Summary: Overloaded ref-qualified conversion operator triggers bogus -Wconversion Product: gcc Version: 13.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: m.cencora at gmail dot com Target Milestone: --- Following code when compiled on any gcc version (checked all available on godbolt since gcc-7) triggers conversion warnings. I consider it bogus because it tells user that it has chosen a better overload (which is good thing, right?). Clang doesn't print any related warning even with -Weverything g++ -std=c++17 -Wconversion template <typename T> struct wrapper { operator T() const&; operator T&&() &&; }; wrapper<int> createInt(); int test() { return createInt(); } Output is: <source>:13:21: warning: choosing 'wrapper<T>::operator T&&() && [with T = int]' over 'wrapper<T>::operator T() const & [with T = int]' [-Wconversion] 13 | return createInt(); | ~~~~~~~~~^~ <source>:13:21: warning: for conversion from 'wrapper<int>' to 'int' [-Wconversion] <source>:13:21: note: because conversion sequence for the argument is better