@R的答案.Martinho Fernandes表示,在C++ 11中,安全布尔的习语显然已被弃用,因为它可以被简单的替换
explicit operator bool() const;
Run Code Online (Sandbox Code Playgroud)
根据答案中的标准引用§4 [conv] p3:
对于某些发明的临时变量(§8.5),
T当且仅当声明T t=e;格式正确时,表达式e才能隐式转换为类型t.某些语言结构要求将表达式转换为布尔值.对于某些发明的临时变量t(§8.5),当且仅当声明格式正确时,表示出e现在这样的上下文中的表达被上下文转换为bool并且格式良好bool t(e);.
突出显示的部分清楚地显示了"隐式显式转换"(在标准中称为"上下文转换")为@R.马蒂纽说.
需要"隐式显式强制转换"的"某些语言结构"似乎如下:
if,while,for(§6.4 [stmt.select] p4)&&和||(§5.14 [expr.log.and/or] p1两者)!(§5.3.1 [expr.unary.op] p9)?:(§5.14 [expr.cond] p1)static_assert(§7 [dcl.dcl] p4)noexcept(§15.4 [except.spec] p2 …在Stroustrup的The C++ Programming Language:Special Edition(3rd Ed)中,Stroustrup写道,控制语句条件中的变量声明和初始化不仅是允许的,而且是鼓励的.他写道,他鼓励它,因为它将变量的范围缩小到只有它们所需的范围.所以像这样......
if ((int i = read(socket)) < 0) {
// handle error
}
else if (i > 0) {
// handle input
}
else {
return true;
}
Run Code Online (Sandbox Code Playgroud)
...是很好的编程风格和实践.该变量i仅存if在于需要它的语句块中,然后超出范围.
但是,g ++(版本4.3.3 Ubuntu特定编译)似乎不支持编程语言的这个特性,这对我来说是令人惊讶的.也许我只是用一个标志来调用g ++来关闭它(我称之为的标志是-g和-Wall).在使用这些标志进行编译时,我的g ++版本返回以下编译错误:
socket.cpp:130: error: expected primary-expression before ‘int’
socket.cpp:130: error: expected `)' before ‘int’
Run Code Online (Sandbox Code Playgroud)
在进一步的研究中,我发现我似乎并不是唯一一个不支持此编译器的编译器.并且在这个问题中似乎存在一些混淆,因为确切地说语言在语言中是什么标准,以及编译器使用它编译什么.
所以问题是,什么编译器支持这个功能以及需要设置哪些标志才能编译?这是某个标准而不是其他标准的问题吗?
另外,出于好奇,人们普遍认同Stroustrup这是好风格吗?或者这是一种语言的创造者在他脑海中获得一个想法的情况,这个想法不一定得到语言社区的支持?