相关疑难解决方法(0)

C++ 11中的safe-bool成语是否过时了?

@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 …

c++ c++-faq deprecated safe-bool-idiom c++11

174
推荐指数
1
解决办法
2万
查看次数

在C++中声明和初始化Conditional或Control语句中的变量

在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这是好风格吗?或者这是一种语言的创造者在他脑海中获得一个想法的情况,这个想法不一定得到语言社区的支持?

c++ compiler-construction conditional declaration

26
推荐指数
4
解决办法
8537
查看次数