所以,我有一个返回 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/