所以,我有一个返回 bool 值的函数

bool func_true()
{
    // do some stuff
    return true;
}

现在实际的代码像这样
if (auto err = func_true())
{
    // some stuff
    std::cout << std::boolalpha << err << '\n';
}

到现在为止一切都很好。如果我在通话中加上一个多余的圆括号,则编译将失败:
if ((auto err = func_true())) // doesn't compile!
{
    std::cout << std::boolalpha << err << '\n';
}

GCC错误:
error: expected primary-expression before 'auto'
 if ((auto err = func_true()))
      ^~~~

http://coliru.stacked-crooked.com/a/812424bfdb66eec3

这是gcc错误,还是我做错了什么?

最佳答案

if statement的语法(根据最新的C++标准ISO/IEC 14882:2014)如下:

条件的语法如下:

现在,代码auto err = func_true()匹配条件上的第二种形式,具体地说,auto匹配decl-specifier-seq,err匹配声明器,func_true()匹配初始化器子句
但是代码(auto err = func_true())无法匹配条件的第二种或第三种形式,因为(无法启动attribute-specifier-seq或decl-specifier-seq,但是它可以启动表达式
语法为:

现在,如果遵循语法定义,您将发现auto无法启动表达式(标识符可以,但auto是关键字,而不是标识符)
简单来说,GCC的行为是正确的,这是一个语法错误。

关于c++ - 放置多余的圆括号-代码无法编译,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36973761/

10-11 22:38
查看更多