【发布时间】:2016-01-09 05:14:16
【问题描述】:
以下代码在 C++14 中被认为是非法的,但在 C++17 中是合法的:
#include <functional>
int main()
{
int x = 1729;
std::function<void (int&)> f(
[](int& r) { return ++r; });
f(x);
}
不要费心对其进行测试,您会得到不一致的结果,因此很难判断这是错误还是故意行为。然而,比较两个草稿(N4140 与 N4527,两者都可以在 github.com/cplusplus/draft 上找到),[func.wrap.func.inv] 有一个显着差异。第 2 段:
返回:如果 R 为 void,则返回 Nothing,否则返回 INVOKE (f, std::forward(args)..., R) 的值。
以上内容已在草稿之间删除。这意味着 lambda 的返回值现在被默默地丢弃。这似乎是一个错误的特征。谁能解释一下原因?
【问题讨论】:
-
LWG 2420。这种行为从一开始就是有意的,只是偶然被删除。
-
@T.C.谢谢。我关注的是库缺陷而不是语言缺陷。
-
应该是
return f(x);? -
@AlanStokes
int main()在 C++ 中可以没有返回值,默认返回 0。另外,f有返回类型void无论如何,不能返回。 -
好吧,我确实说过绑定 :)