我们都知道这是一个最令人烦恼的解析:
Foo f( Bar() );
每个编译器都认为声明了一个函数。但我从来没有见过任何人,在这样的函数声明中使用括号。这些括号甚至意味着什么? 假设它是一个函数声明 -
之间是否有任何区别Foo func( Bar() ); //do we need the parenthesis after Bar?
Foo func( Bar );
Foo func( Bar b );
" Bar()"相当于" Bar"那里?或者是否有其他一些添加括号的行为?如果没有,那么为什么C ++允许在这样的函数声明中使用括号?它真的看起来应该是函数delaration中的错误,不是吗?
答案 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;到处感染它!