c++ - 为什么这是 C++ 中的有效函数声明?

标签 c++ c++11

<分区>

Foo x(Bar());

我可以在另一个函数中写入并编译。为什么? 另外,函数声明如何在其签名中获取临时对象?

最佳答案

好吧,你可以这样做:

Foo x();

这声明了一个函数 x,它不接受任何参数并返回 Foo

我们可以添加参数:

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++ 中的有效函数声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47484413/

相关文章:

c++ - 剪辑在 C++ 中创建多场

c++ - 为什么 std::string 关系运算符比较结果对于模板和函数是不同的?

c++ - to_string 不是 std 的成员,g++ (mingw)

c++ - 动态数组-读取

c++ - 指向 const 的成员指针

c++ - SDL 1.2 -> SDL 2.0(崩溃程序)

c++ - 错误 C2248 : 'sf::NonCopyable::NonCopyable'

c++ - 将 boost 套接字放入 std::map

c++11 - lambda 和 std::function 有什么区别?

c++ - Qt永久线程