decltype中的C++ 11 lambda

HC4*_*ica 31 c++ lambda decltype c++11

对于以下代码:

auto F(int count) -> decltype([](int m) { return 0; }) 
{                                                               
    return [](int m) { return 0; };                                  
}
Run Code Online (Sandbox Code Playgroud)

g ++ 4.5给出错误:

test1.cpp:1:32: error: expected primary-expression before 'int'
test1.cpp:1:32: error: expected ')' before 'int'
Run Code Online (Sandbox Code Playgroud)

问题是什么?从函数返回lambda的正确方法是什么?

Pup*_*ppy 45

除了通过实际创建该对象之外,您不能使用lambda表达式 - 这使得无法像decltype那样传递类型推导.

具有讽刺意味的是,当然,lambda返回规则使得你可以从lambdas返回lambdas,因为在某些情况下不必指定返回类型.

你只有两个选择 - 返回一个多态容器,如std::function,或使F本身成为一个实际的lambda.

auto F = [](int count) { return [](int m) { return 0; }; };
Run Code Online (Sandbox Code Playgroud)

  • +1用于清除问题.我检查了SC22-N-4411草案,发现有点可怕的短语说"每个lambda表达式都有一个独特的类型". (3认同)
  • @ 6502:是的,这个事实让我意识到为什么我的可执行文件大小突然增加了10%,因为`stable_sort`. (3认同)
  • 为什么decltype(std :: declval <[](){}>())不起作用?这不是什么意思?在未评估的上下文中创建类型的实例?有没有办法禁止哑优化器在堆栈上分配函数指针? (3认同)

And*_*hko 10

这样的东西适合你的需求?

#include <functional>

std::function<int(int)> F(int count)
{                                                               
    return [](int m) { return 0; };                                  
}
Run Code Online (Sandbox Code Playgroud)


Zar*_*doo 5

使用C ++ 14,现在可以实现:

auto F(int count)
{
    return [](int m) { return 0; };
}
Run Code Online (Sandbox Code Playgroud)