https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110005
Bug ID: 110005 Summary: Writable strings seem too greedy in overload resolution Product: gcc Version: unknown Status: UNCONFIRMED Keywords: diagnostic Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: arthur.j.odwyer at gmail dot com Target Milestone: --- I'm not clear on the entire behavior of -Wwrite-strings; bug 61579 seems relevant. So there's probably an iceberg lurking below the surface. But here's the tip, anyway. // https://godbolt.org/z/Y5saPdozT struct Evil { Evil(const char*, const void*) { puts("1"); } Evil(const char*, std::string) { puts("2"); } Evil(const char*, char*) { puts("3"); } }; int main() { Evil e = {"", ""}; } MSVC considers the only viable candidates #1 and #2. Clang considers #1 and #2 preferable to #3, but will pick #3 if it's the only candidate. GCC considers #3 the *best* candidate, even better than #1. Or again, something like this: void f(const char *, std::string) { puts("4"); } template<class T> void f(T *, std::remove_const_t<T> *) { puts("5"); int main() { f("", ""); } MSVC considers #4 the only viable candidate. Clang considers #4 preferable to #5, but will pick #5 if it's the only candidate. GCC considers #5 the *best* candidate, even better than #4. Obviously MSVC's behavior is the conforming one; but I understand GCC isn't likely to go all the way *there*. Still, Clang's behavior strikes me as a better compromise than GCC's. As a consolation prize, assuming there's some way to turn off GCC's writable-strings extension, could the text of -Wwrite-strings' warning message be updated to provide that option? E.g. instead of the current > warning: ISO C++ forbids converting a string constant to > 'std::remove_const_t<const char>*' {aka 'char*'} [-Wwrite-strings] it could say, like, > warning: ISO C++ forbids converting a string constant to > 'std::remove_const_t<const char>*' {aka 'char*'}; pass -fno-writable-strings > to disable this extension [-Wwrite-strings] or however the extension can actually be disabled.