最令人烦恼的解析中的括号是什么?#34;应该做的?

时间:2017-01-08 15:18:40

标签: c++ most-vexing-parse

我们都知道这是一个最令人烦恼的解析:

Foo f( Bar() );

每个编译器都认为声明了一个函数。但我从来没有见过任何人,在这样的函数声明中使用括号。这些括号甚至意味着什么?  假设它是一个函数声明 -

之间是否有任何区别
Foo func( Bar() ); //do we need the parenthesis after Bar?
Foo func( Bar );
Foo func( Bar b );

" Bar()"相当于" Bar"那里?或者是否有其他一些添加括号的行为?如果没有,那么为什么C ++允许在这样的函数声明中使用括号?它真的看起来应该是函数delaration中的错误,不是吗?

1 个答案:

答案 0 :(得分:2)

  

" Bar()" [等同于]" Bar"有?

没有

  

或者是否有其他一些添加括号的行为?

正如在任何表达式中一样,通常的期望是这会创建一个Bar类型的临时表。程序员希望将该临时函数作为参数传递给函数。

  

如果没有,那么为什么C ++允许在这样的函数声明中使用括号?它真的看起来应该是函数[声明]中的错误,不是吗?

C ++没有任何理由禁止这一点。很糟糕的是,上述期望并不总是真正得到满足(因为最令人烦恼的解析);禁止使用临时工作作为功能论点会更糟糕。

Here是将临时函数作为函数参数传递的常见且惯用的示例:

// Read all input from cin one word at a time, storing
// the words in col.
std::vector<std::string> col;
std::copy(
   std::istream_iterator<string>(cin),
   std::istream_iterator<string>(),
   std::back_inserter(col)
);

实际上,所有这些论点都是临时的。但是,只有一个(就像你的例子)本身没有任何论据。

现在,如果你问为什么C ++完全可以通过禁止那些括号的其他含义来避免最烦恼的解析,那么,它可以做到。但是......只是通过大幅度改变函数声明的语法结构,这可能会破坏现有的代码依赖过时的C-isms。最好不要,嗯?

括号可以意味着最令人烦恼的解析让他们意味着什么,仅仅是由于语法的构建方式,以及不希望有特殊情况的愿望&#34;到处感染它!