Al haber introducido recientemente una sobrecarga de un método, la aplicación comenzó a fallar. Finalmente rastreando, se llama al nuevo método donde no esperaba que fuera.¿Por qué el compilador elige bool sobre string para typecast implícito de L ""?
Tuvimos
setValue(const std::wstring& name, const std::wstring& value);
std::wstring avalue(func());
setValue(L"string", avalue);
std::wstring bvalue(func2() ? L"true", L"false");
setValue(L"bool", bvalue);
setValue(L"empty", L"");
fue cambiado de modo que cuando se almacena un valor bool que utilizamos las mismas cadenas (almacenamiento de datos interna de cuerdas)
setValue(const std::wstring& name, const std::wstring& value);
setValue(const std::wstring& name, const bool& value);
std::wstring avalue(func());
setValue(L"string", avalue);
setValue(L"bool", func2());
setValue(L"empty", L""); << --- this FAILS!?!
El problema con L "" es que está lanzando implícitamente y anteriormente estaba contento de ser un std :: wstring, pero no prefiere ser un bool. El compilador de MSVC no se queja o genera una advertencia, por lo que me preocupa que incluso si "soluciono" el setValue (L "vacío", L ""); ser
setValue(L"empty", std::wstring());
otra persona puede venir más tarde y sólo tiene que utilizar setValue (L "vacío", L ""); y tenemos que seguir este problema de nuevo.
Pensamos utilizar explícito en el método, pero no es una palabra clave válida para este uso. ¿Hay alguna forma de que el compilador se queje de esto o evite el problema? De lo contrario, estoy pensando en cambiar el nombre del método que toma un bool para asegurarse de que no puede hacer una suposición incorrecta.
Agregado a mi lista de razones por las cuales C++ no es el mejor idioma. – Qix