C ++:在函数调用中省略参数值是否有效?

时间:2016-09-04 16:53:32

标签: c++ gcc compiler-errors language-lawyer

使用GCC 6从源代码编译VTK 7.0.0时,我遇到了以下构建错误:

  

错误:在'('token

之前预期的primary-expression      

radioButton_Min-> setGeometry(QRect(10,20,17));

用于与之前的Fedora版本捆绑在一起的GCC 5构建的代码。我意识到这可能是VTK作者的错误,但鉴于用于构建的代码,这里有两个问题:

  • 此代码是否有效C ++?
  • 此代码是否对GCC和/或其他编译器有效,但是设置有一些松散的设置,而标准无效?目前我的警告和错误设置非常紧张。

重要编辑:

刚刚发现此代码是使用Qt UIC(接口编译器)生成的,该代码基于.ui接口定义文件生成C ++代码。可能以前版本的UIC处理的方式不同。但是,对我来说,问题仍然存在:你能引用标准来肯定这是非法的C ++吗?

1 个答案:

答案 0 :(得分:3)

  

5.2.2函数调用

     

函数调用是后缀表达式,后跟括号   包含一个可能为空的逗号分隔列表   initializer-clause,构成函数的参数。

请注意,这只表示函数调用的参数列表可能“可能为空”。明显。但是参数列表中的每个参数都是initializer-clause

initializer-clause中的8.5 Initializers定义如下:

initializer-clause:
    assignment-expression
    braced-init-list

因此,函数调用的每个参数都是assignment-expressionbraced-init-list

braced-init-list始终以{

开始,毫不奇怪
braced-init-list:
   { initializer-list , opt }
   {}

那不包括那个。因此,为了使函数调用的单个参数可能为空,assignment-expression必须能够以某种方式解析为空规则。走下兔子洞:

assignment-expression:
    conditional-expression
    logical-or-expression assignment-operator initializer-clause
    throw-expression

conditional-expression导致了算术表达式的兔子洞:

conditional-expression:
  logical-or-expression
  logical-or-expression ? expression : assignment-expression

这不能为空。进一步解决logical-or-expression将变得非常古老。最重要的是,这里有一个运营商,某处,所以这不可能是空的。

assignment-operator: one of = *= /= %= += -= >>= <<=

这消除了第二种可能的assignment-expression形式为空。它保证有一个操作员。

离开throw-expression

throw-expression:
    throw assignment-expression opt

这可能看起来很奇怪,但第15节定义:“throw-expression的类型为void”。这只是void类型的表达式。最重要的是,这个语法规则也不能为空。

这最终排除了函数调用的参数为空的可能性。 C ++标准规定的语法规则排除了这一点。