c++ - 为什么编译器选择 bool 而不是 string 来进行 L""的隐式类型转换?

标签 c++ visual-c++ implicit explicit

最近引入了一个方法的重载,应用程序开始失败。 终于追踪到,新方法在我没想到的地方被调用了。

我们有

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 的方法的名称,以确保它不会做出错误的猜测。

最佳答案

首先,这个问题的起因:C++ Standard [over.ics.rank]/2.1 1 定义转换序列的顺序。它说用户定义的转换序列比标准转换序列差。在你的情况下发生的是字符串文字经历了 bool 转换(在 4.12 定义。这是一个标准转换)。它不使用用户定义的到 std::wstring 的转换,如果它采用其他重载,则需要这种转换。

我建议简单地更改其中一个重载的名称或添加一个直接接受字符串文字的重载(使用参数类型 wchar_t const*)。


1)

When comparing the basic forms of implicit conversion sequences (as defined in [over.best.ics])

(2.1) a standard conversion sequence is a better conversion sequence than a user-defined conversion sequence or an ellipsis conversion sequence, and
(2.2) a user-defined conversion sequence is a better conversion sequence than an ellipsis conversion sequence.

关于c++ - 为什么编译器选择 bool 而不是 string 来进行 L""的隐式类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39251626/

相关文章:

c++ - 在托管 C++ GUI 中通过另一个事件结束/中断/切换一个事件

c++ - VC有没有像GCC中的 '-fexec-charset'这样的编译选项来设置执行字符集?

c++ - 链接 DLL 错误 visual studio

scala - 有没有办法用中缀表示法调用scala方法(具有类型参数)

c++ - Zmq 上下文 - 我应该在新线程中创建另一个上下文吗?

c++ - VisualStudio 2010 Express 上的 RDTSC - C++ 不支持默认整数

c++ - if else if 语句 c++ 的问题

c++ - 引用数据成员到模板的实例化

scala - 对 Scala 方法调用约定感到困惑,特别是 Seq 上的 sum 函数

arrays - 隐式类适用于所有 Traversable 子类,包括 Array