考虑以下代码片段:
#include <iostream>
#include <vector>
#include <functional>
int main()
{
std::vector<int>v = {0,1,2,3,4,5,6};
std::function<const int&(int)> f = [&v](int i) { return v[i];};
std::function<const int&(int)> g = [&v](int i) -> const int& { return v[i];};
std::cout << f(3) << ' ' << g(3) << std::endl;
return 0;
}
我本来期望得到同样的结果:在 f
中,v
是通过 const 引用传递的,所以 v[i]
应该有 const int&
类型。
然而,我得到了如下结果
0 3
如果我不使用std :: function,一切都好:
#include <iostream>
#include <vector>
#include <functional>
int main()
{
std::vector<int>v = {0,1,2,3,4,5,6};
auto f = [&v](int i) { return v[i];};
auto g = [&v](int i) -> const int& { return v[i];};
std::cout << f(3) << ' ' << g(3) << std::endl;
return 0;
}
输出:
3 3
因此我想知道:
在第二个片段中,lambda表达式
f
的返回类型是什么?f
和g
是相同的吗?在第一个片段中,构造
std::function f
时发生了什么,导致出现错误?
f(3)
上,而不是g(3)
。 - huuv
是通过 const 引用传递的,所以v[i]
应该具有const int&
类型。不,v
被引用捕获,因此v[i]
是非 const 的int&
。我不确定在这种情况下是否应该有所区别。在 gcc 4.9.2 中似乎有预期的输出。 - eerorikastd::function<const T&(blah)>
始终是未定义行为,因为它导致悬空引用。C++标准委员会正在考虑将其定义为非法。 - Jonathan Wakelystd::function<const int&(int)>::operator()
返回值,因为它被绑定到了std::function<const int&(int)>::operator()(int)
内部的一个局部临时变量上。 - Jonathan Wakely