【发布时间】:2017-01-20 12:45:27
【问题描述】:
假设我有一个具有以下签名的函数:
void foo(std::function<void(int&)>& bar);
以下调用编译成功:
foo([](int& x) { ++x; });
这也编译成功了:
std::function<void(int&)> myFunction = [](int& x) { ++x; };
foo(myFunction);
但是使用自动类型推断,它突然无法编译:
auto myFunction = [](int& x) { ++x; };
foo(myFunction);
AFAIK 推断的 lambda 类型未指定,但它应该充当仿函数/可调用对象。我不明白的是,如果不允许将相同的 lambda 作为同一类型的函数参数传递,怎么可能将相同的 lambda 分配给 std::function<void(int&)>?
在 GCC v4.8.5 上测试,使用 -std=c++11。
【问题讨论】:
-
是的,在其他答案提到该代码不应该编译之后,我检查了 cpp.sh 和 godbolt(在那里使用 gcc v4.8.5),它确实没有编译。很奇怪,因为在我的工作机器上 gcc 编译它没有问题,现在我得到了解释你如何只能将右值绑定到常量引用的答案......