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

Putting extra round brackets - code fails to compile

本文关键字:代码 编译 圆括号      更新时间:2023-10-16

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

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语句的语法(根据最新的C++标准ISO/IEC 14882:2014)如下:

if (条件)语句[else声明]

条件的语法如下:

表达式

[属性说明符seq]decl说明符seq声明符=初始值设定项子句

[属性说明符seq]decl说明符seq声明符支持的初始化列表

现在,代码auto err = func_true()匹配条件的第二种形式,特别是,auto匹配decl说明符seqerr匹配declaratorfunc_true()匹配>initializer子句

但是代码(auto err = func_true())不能匹配条件的第二或第三种形式,因为(不能启动属性说明符seqdecl说明符seq,但它可以启动表达式

语法为:

[表达式,]赋值表达式

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

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