【发布时间】:2015-05-13 23:54:12
【问题描述】:
以下编译并运行(在 Apple LLVM 版本 6.1.0 和 Visual C++ 2015 下):
#include <functional>
#include <iostream>
struct s { int x; };
int main(int argc, char **argv)
{
std::function<void (s &&)> f = [](const s &p) { std::cout << p.x; };
f(s {1});
return 0;
}
为什么赋值std::function<void (s &&)> f = [](const s &p) { std::cout << p.x; }; 不会产生错误?接受右值引用的函数不应该与接受 const 左值引用的函数具有相同的签名,不是吗?从 lambda 的声明中删除 const 确实会产生预期的错误。
【问题讨论】:
-
gcc 5.1 也不抱怨。
-
吹毛求疵:你没有分配给
std::function。尽管语法非常相似,std::function<..> f = ..;是一个初始化而不是赋值,因为它定义了一个新对象。 -
这类似于函数参数的普通逆变。
标签: c++ c++11 lambda rvalue-reference