【发布时间】:2019-02-21 14:45:19
【问题描述】:
请看下面的代码
#include <iostream>
#include <functional>
#include <string>
int main()
{
std::function<void(std::string&)> theFunc;
std::string foo = "0";
theFunc = [](std::string a) { a = "1"; }; // this compiles but has a different function signature
theFunc(foo);
std::cout << "foo should be 1 but is " << foo << std::endl;
theFunc = [](auto a) { a = "2"; }; // this infers the wrong type for auto(by val not by ref), creates the wrong function signature and compiles
theFunc(foo);
std::cout << "foo should be 2 but is " << foo << std::endl;
theFunc = [](std::string& a) { a = "3"; }; // this compiles and correctly manipulates the string
theFunc(foo);
std::cout << "foo should be 3 and is " << foo << std::endl;
theFunc = [](auto& a) { a = "4"; }; // this compiles and correctly manipulates the string
theFunc(foo);
std::cout << "foo should be 4 and is " << foo << std::endl;
std::cin.get();
}
在代码示例中,我们为一个 std::function 分配了不同类型的 lambda。
我理解 lambda 3 因为函数签名匹配。
但是 lambda 1 创建了不同的函数签名,但编译正确。
Lambda 2 推断出错误的自动类型(通过 val 而不是通过 ref)并正确编译。
这是功能还是错误?我对函数类/lambdas 和自动类型推断有什么误解?
更新:
感谢Handy999的回答,但是为什么下面没有编译呢?
std::function<void(std::string)> theFunc2;
theFunc2 = [](std::string& a) { a = "1"; }; // this doesn't compile and has a different function signature
theFunc2(foo);
【问题讨论】:
-
第五种情况失败,因为您不能使用临时字符串调用该 lambda(即
[](std::string& a) { a = "1"; }("1");无效)。std::function保留该限制 -
谢谢 Caleth,就是这样。 [](const std::string& a) { } 已编译。
标签: c++ lambda c++14 generic-lambda