【发布时间】:2020-02-12 07:47:37
【问题描述】:
我正在尝试使用 auto 作为返回的 lambda 函数的返回类型。这是一个演示我遇到的问题的最小示例:
#include <iostream>
#include <memory>
auto
get_func()
{
auto i = std::make_unique<int>(2);
if (*i == 1) {
return [i=std::move(i)]() {
return *i;
};
}
return [](){ return 2; };
}
int
main(int argc, char* argv[])
{
auto func = get_func();
std::cout << "val: " << func() << std::endl;
return 0;
}
在我的 mac 上,我收到以下编译错误:
$ g++ -g -Wall -Werror -std=c++17 test.cc -o test
test.cc:13:5: error: 'auto' in return type deduced as '(lambda at test.cc:13:12)' here but deduced as '(lambda at test.cc:9:16)' in earlier return statement
return [](){ return 2; };
^
1 error generated.
对,它们都被推断为lambda。而且它们都有相同的void(void) 签名。我看到问题是因为它们指定了不同的捕获吗?如果是这样,我有哪些选择可以让调用者使用相同的函数调用(如 main 中的 cout 调用所示)。
【问题讨论】: