Недавно введя перегрузку метода, приложение начало сбой.
Наконец, отслеживая его, новый метод вызывается там, где я не ожидал.
У нас было
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"" );
Он был изменен таким образом, чтобы при сохранении значения bool мы использовали одни и те же строки (внутреннее хранилище данных строк)
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!?!
Проблема с L "" заключается в том, что он неявно приводится, и ранее он был счастлив быть std :: wstring, но не предпочитал быть bool.
Компилятор MSVC не жалуется и не выдает предупреждение, поэтому я беспокоюсь, что даже если я "исправлю" setValue (L "empty", L ""); быть
setValue( L"empty", std::wstring() );
кто-то другой может прийти позже и просто использовать setValue (L "empty", L ""); и придется снова выследить эту проблему.
Мы подумали использовать явный метод, но это недопустимое ключевое слово для этого использования.
Есть ли какой-нибудь способ заставить компилятор жаловаться на это или иным образом предотвратить проблему? В противном случае я думаю поменять имя метода, который использует bool, чтобы убедиться, что он не может сделать неправильное предположение.