当前位置:  开发笔记 > 编程语言 > 正文

为什么编译器选择bool over string进行L""的隐式类型转换?

如何解决《为什么编译器选择booloverstring进行L""的隐式类型转换?》经验,为你挑选了2个好方法。

最近引入了方法的重载,应用程序开始失败.最后跟踪它,新的方法被调用,我没想到它.

我们有

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



1> Johannes Sch..:

首先,这个问题的原因:C++ Standard 1定义了转换序列的顺序.它表示用户定义的转换序列比标准转换序列更差.在您的情况下发生的是字符串文字经历布尔转换(定义于.这是标准转换).它不使用用户定义的转换,如果它需要另一个重载.[over.ics.rank]/2.14.12std::wstring

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


1)

比较隐式转换序列的基本形式(如定义[over.best.ics])

(2.1)标准转换序列是比用户定义的转换序列或省略号转换序列更好的转换序列,并且
(2.2)用户定义的转换序列是比省略号转换序列更好的转换序列.



2> Mark Ransom..:

L""是指向宽字符串的指针.编译器认为转换为bool优先于转换为std :: wstring.

要解决此问题,请引入新的setValue:

void setValue(std::wstring const& name, const wchar_t * value);


不完全是.L""是一个宽字符串文字.
推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有