所以,我有一个返回布尔值的函数
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错误,还是我做了一些愚蠢的错误?
答案 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的行为是正确的,这是一个语法错误。