【发布时间】:2016-07-11 08:35:03
【问题描述】:
我最近对 lambda 可以分配给 std::functions 并略有不同签名这一事实感到惊讶。 略有不同意味着当 function 被指定为返回 void 时,lambda 的返回值可能会被忽略,或者参数可能是 function 中的引用但 lambda 中的值。
请参阅this example (ideone),我在其中强调了我怀疑不兼容的内容。我认为返回值不是问题,因为您总是可以调用函数并忽略返回值,但是从引用到值的转换对我来说看起来很奇怪:
int main() {
function<void(const int& i)> f;
// ^^^^ ^^^^^ ^
f = [](int i) -> int { cout<<i<<endl; return i; };
// ^^^ ^^^^^^
f(2);
return 0;
}
次要问题是:为什么这段代码可以编译和工作?主要问题是:与std::function一起使用时,lambda参数和返回值类型转换的一般规则是什么?
【问题讨论】:
-
另外:我在这里描述的内容是否有一个特定的术语,或者 类型转换 是否正确?
-
允许将非空函数存储在
std::function<void(blah)>中是 GCC 始终支持的,现在是必需的,请参阅 cplusplus.github.io/LWG/lwg-defects.html#2420 -
“主要问题是:lambda 参数和返回值的类型转换的一般规则是什么?” 不,你的问题是关于在
std::function中使用 lambda,这与关于 lambda 返回类型的一般规则不同。 -
事实上它根本不特定于 lambda,因为完全相同的规则适用于存储在
std::function中的普通函数。普通函数也有参数和返回类型,通过std::function调用也可以进行转换。 -
那是因为
std::function不是函数指针,也不是虚拟覆盖。它包装了一个可调用对象,添加了一个间接级别,并且可以在该间接级别进行转换。直接类比见我的回答。
标签: c++ c++11 lambda type-conversion