【问题标题】: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 x{Bar{}};。有些人不喜欢它,因为他们更喜欢内容为{2}vector<int> v(1, 2);,而不是内容为{1, 2}vector<int> v{1, 2};

标签: c++ c++11


【解决方案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 *);

【讨论】:

  • 为什么我可以在另一个函数中声明,而不仅仅是在全局范围内?但是当我想向函数添加一个主体时,我得到一个错误
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2012-08-21
  • 2015-04-30
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多