【发布时间】:2008-11-25 02:32:08
【问题描述】:
最近引入了应用程序开始失败的方法的重载。 终于追踪到了,新方法在我没想到的地方被调用了。
我们有
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"" );
改变了,当存储一个布尔值时,我们使用相同的字符串(字符串的内部数据存储)
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 的方法的名称,以确保它不会做出错误的猜测。
【问题讨论】:
-
添加到我的 C++ 不是最佳语言的原因列表中。
标签: c++ visual-c++ implicit explicit