随着c ++ 11中的变化
更改:更改:在现有的布尔转换运算符中指定显式使用(https://timsong-cpp.github.io/cppwp/n4618/diff.cpp03.input.output)
有效的c ++ 03代码可以在c ++ 11中中断吗?
struct abt {
public:
abt(int a, double b){}
abt(int a){cout<<"int"<<endl;}
abt(bool b) {cout<<"bool"<<endl;}
abt(bool b,bool c) {cout<<"bool bool"<<endl;}
operator bool() const { return true; } };
int main() {
abt is("a",3);
if (is)
std::cout << "success";
if( is == true)
std::cout << "success";
return 0;
}
此有效的c ++ 03代码在c ++ 11中给出相同的输出,具有隐式布尔转换的输出在c ++ 11中也相同。规则有什么错吗?
即使您abt
只进行显式转换if(is)
,在C ++ 11中也可以,因为an的条件if
是显式转换是“隐式”的上下文。来自cppreference:
在以下上下文中,如果声明
bool t(e);
的格式正确(即explicit T::operator bool() const;
考虑了诸如之类的显式转换函数),则将预期使用bool类型并执行隐式转换。据说这种表达e在上下文中转换为bool。
- 的控制表达
if
,while
,for
;- ...
C ++ 11中发生的变化是,许多隐式转换为标准类型的布尔转换为显式转换。例如std::istream::operator bool
:
operator void*() const; (1) (until C++11)
explicit operator bool() const; (2) (since C++11)
总是错误的代码,但是以前编译过的代码现在将无法编译,这很好。例如:
#include <iostream>
void foo(bool){}
int main()
{
foo(std::cout);
}
另一方面,如果您这样编写代码,并且隐式转换是有意的,那么您的代码将在C ++ 11中中断。
TL; DR:
这不是的重大变化if(is)
。如果现在还不错,那还不错(is
您的自定义类型是转换为bool
标准类型还是标准类型,并且无论转换是否显式)。如果您过分依赖标准类型的隐式转换,则可能会遇到一两个惊喜。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句