最近引入了方法的重载,应用程序开始失败.最后跟踪它,新的方法被调用,我没想到它.
我们有
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"空",L""); 成为
setValue( L"empty", std::wstring() );
别人可能会稍后来,只需使用setValue(L"空",L""); 并且必须再次追踪这个问题.
我们认为在方法上使用explicit,但它不是此用法的有效关键字.有没有办法让编译器抱怨这个,或者以其他方式阻止这个问题?否则,我正在考虑更改采用bool的方法的名称,以确保它不会做出错误的猜测.
首先,这个问题的原因:C++ Standard 1定义了转换序列的顺序.它表示用户定义的转换序列比标准转换序列更差.在您的情况下发生的是字符串文字经历布尔转换(定义于.这是标准转换).它不使用用户定义的转换,如果它需要另一个重载.[over.ics.rank]/2.1
4.12
std::wstring
我建议只需更改其中一个重载的名称或添加一个直接接受字符串文字的重载(使用参数类型wchar_t const*
).
1)
比较隐式转换序列的基本形式(如定义
[over.best.ics]
)(2.1)标准转换序列是比用户定义的转换序列或省略号转换序列更好的转换序列,并且
(2.2)用户定义的转换序列是比省略号转换序列更好的转换序列.
L""是指向宽字符串的指针.编译器认为转换为bool优先于转换为std :: wstring.
要解决此问题,请引入新的setValue:
void setValue(std::wstring const& name, const wchar_t * value);