额外的圆括号 - 代码无法编译

时间:2016-05-02 01:10:24

标签: c++ c++11

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

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错误,还是我做了一些愚蠢的错误?

1 个答案:

答案 0 :(得分:6)

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

  

if ( 条件 ) 声明 [else 声明] < / p>

条件的语法如下:

  

表达

     

[ attribute-specifier-seq ] decl-specifier-seq 声明符 = 初始化子句

     

[ attribute-specifier-seq ] decl-specifier-seq 声明符 支持 - INIT-列表

现在代码auto err = func_true()与条件中的第二个表单匹配,具体而言,auto匹配 decl-specifier-seq err匹配声明符func_true()匹配 initializer-clause

但代码(auto err = func_true())无法匹配条件的第二种或第三种形式,因为(无法启动 attribute-specifier-seq 也不是 decl-specifier-seq ,但它可以启动表达式

语法是:

  

[表达式 ,] assignment-expression

现在,如果您遵循语法定义,您会发现auto无法启动表达式(标识符可以,但auto是关键字,因此不是标识符)

简单地说,GCC的行为是正确的,这是一个语法错误。