【发布时间】:2015-12-28 13:33:18
【问题描述】:
如果函数返回引用但返回类型未显式调用为引用,则我在使用从 lambdas 创建的 std::functions 时遇到问题。似乎 std::function 被创建得很好,没有任何警告,但是在调用它时,会在需要引用时返回一个值,从而导致事情崩溃。这是一个非常人为的例子:
#include <iostream>
#include <vector>
#include <functional>
int main(){
std::vector<int> v;
v.push_back(123);
std::function<const std::vector<int>&(const std::vector<int>&)> callback =
[](const std::vector<int> &in){return in;};
std::cout << callback(v).at(0) << std::endl;
return 0;
}
这会打印出垃圾,但是如果将 lambda 修改为显式返回 const 引用,它就可以正常工作。我可以理解编译器认为 lambda 是按值返回而没有提示(当我最初遇到这个问题时,lambda 直接从返回 const 引用的函数返回结果,在这种情况下,我会认为lambda 的 const 引用返回是可推导出的,但显然不是。)令我惊讶的是编译器允许 std::function 从具有不匹配返回类型的 lambda 构造。这种行为是预期的吗?我是否遗漏了标准中允许发生这种不匹配的内容?我在 g++ (GCC) 4.8.2 中看到了这个,还没有尝试过其他任何东西。
谢谢!
【问题讨论】:
-
@Nawaz 你为什么删除你的答案?
-
Clang++ 3.7.0 也会打印垃圾(g++ 导致我出现分段错误)。
-
@jhnnslschnr 感谢您的检查 - 不知道为什么发布的答案被删除(它似乎是正确的)但本质是返回值的 lambda 将愉快地绑定到带有引用返回的 std::function类型,最终结果是 lambda 返回一个副本,而函数返回对临时副本的引用。我想这与从具有引用返回类型的函数返回局部变量没有什么不同。
标签: c++ c++11 lambda g++ std-function