以下代码编译并运行(在 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 左值引用的函数具有相同的签名,不是吗?丢弃const
从 lambda 的声明中确实会产生预期的错误。
扩展现有的评论和答案:
要点是std::function<R(A...)>
是它可以包装任何可以调用的函数或函子A...
并将结果存储在R
.
所以,举例来说,
std::function<int(int)> f = [](long l) { return l; };
只是桃色的。
所以当你看到这样的事情时你必须问自己:如果你有一个 lambdaconst T &
,并且你有一个类型的表达式T &&
(或者,更准确地说,您有一个 xvalue 类型T
),你可以使用该表达式来调用 lambda 吗?
是的你可以。
如果你可以的话std::function
应该能够存储该函子。这几乎是要点std::function
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)