为啥这是 C++ 中的有效函数声明? [复制]

Posted

技术标签:

【中文标题】为啥这是 C++ 中的有效函数声明? [复制]【英文标题】:Why is this a valid function declaration in C++? [duplicate]为什么这是 C++ 中的有效函数声明? [复制] 【发布时间】:2017-11-25 09:24:32 【问题描述】:
Foo x(Bar());

我可以在另一个函数中写入并编译。为什么? 还有一个函数声明如何在它的签名中获得一个临时对象?

【问题讨论】:

不是临时的。目的。它是什么都没有得到并返回 Bar 的函数 @Peter 你确定吗? ideone.com/Vgg6Ia @Peter 你错了。 @Peter,不在这种情况下 一个典型的解决方法是使用统一初始化:Foo xBar;。有些人不喜欢它,因为他们更喜欢内容为2vector<int> v(1, 2);,而不是内容为1, 2vector<int> v1, 2; 【参考方案1】:

好吧,你可以这样做:

Foo x();

这声明了一个不带参数并返回Foo的函数x

我们可以添加参数:

Foo x(int y, char z);

参数只是一个变量声明(此处为xz)。

我们可以在函数声明中省略参数名称:

Foo x(int, char);

我们可以将参数声明为函数:

Foo x(Bar y());

在这里,我们将x 声明为一个函数,该函数接受另一个函数y(不接受参数并返回Bar)返回Foo

最后我们也可以在这里省略参数名:

Foo x(Bar ());  // a function taking a function

这就是语法的工作原理。

从语义上讲,您可能会反对,这是无效的,因为函数不是值类型。你不能复制一个函数,所以你不能按值传递它。这是真的,但是有一条规则说任何声明为函数的参数都会被编译器静默调整为指针:

Foo x(Bar y());
// really means:
Foo x(Bar (*y)());

x 接受一个指向函数的指针(不接受任何参数并返回Bar)。

或不带参数名称:

Foo x(Bar ());
// same as:
Foo x(Bar (*)());

这类似于将声明为数组的参数转换为指针的规则:

Foo x(Bar [42]);
// same as:
Foo x(Bar *);

【讨论】:

为什么我可以在另一个函数中声明,而不仅仅是在全局范围内?但是当我想向函数添加一个主体时,我得到一个错误

以上是关于为啥这是 C++ 中的有效函数声明? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C++:为啥必须声明私有函数?

为啥简单的 C++ 向量函数会产生越界的下标? [复制]

为啥我的 C++ 函数只有放在 main() 之后才起作用?

为啥Java没有复制构造函数?

为啥另一个函数中的函数声明会编译,它有啥作用?

为啥“基类对象”不能调用它自己的虚函数? C++