C++ 为什么可以';我在lambda函数的返回类型中定义一个未命名的枚举吗?

C++ 为什么可以';我在lambda函数的返回类型中定义一个未命名的枚举吗?,c++,C++,此代码: void f() { auto determineType = []() -> enum {Type_ONE, Type_TWO} { return Type_ONE; }; } 未能编译: testcase-enum-in-lambda.cpp:3:36: error: unnamed enumeration must be a definition 为什么C++中不允许这样做?这是非常清楚的。未命名的枚举可以与lambda的定义相关

此代码:

void f() {
    auto determineType = []() -> enum {Type_ONE, Type_TWO} {
            return Type_ONE;
    };
}
未能编译:

testcase-enum-in-lambda.cpp:3:36: error: unnamed enumeration must be a definition
<>为什么C++中不允许这样做?这是非常清楚的。未命名的枚举可以与lambda的定义相关联,并且可以具有相同的作用域。我没有看到任何与这个构造相关的问题,除了它可能没有在C++标准中指定。

为什么C++中不允许这样做?

显式返回类型在lambda中表示您正在返回的类型,它没有定义新的类型。

[]()->键入{}

据我所知,这里允许类型定义是一个在C++中还没有表达的新概念。 C++支持类型推断(在C++14之前通过decltype,之后自动进行)。类型推断似乎定义了一个新类型,如本例中所示

模板
自动添加(T,U)->decltype(T+U)//返回类型取决于模板参数
//返回类型可以从C++14开始推导
{
返回t+u;
}

但是,尽管decltype(t+u)似乎标识了一个以前未声明的类型,即使在这种情况下,该类型也是t、u或其他预定义类型
V操作符+(t,u)

这样做有什么不对?声明一个只有lambda知道的返回类型是没有用的


typedef enum 
{ 
    Type_ONE, 
    Type_TWO 
}
teTypes;


void f() 
{
    auto determineType = []() -> teTypes 
    {
        return teTypes::Type_ONE;
    };
}

仅供参考,我推荐Ivan Cukic的书:

它包含了一个很好的描述,C++编译器在后台为你做什么,使lambdas工作(在后台生成一个类等)。


另请参见

我不明白这个问题的目的。是否有一些规则可以制定并添加到标准中,以使此代码合法?可能如果有,又有什么关系呢?现在它是不合法的,也没有使它合法化的建议。事实上,几年前,一项允许未命名结构作为返回类型的类似建议被否决,这比这更有用。原因是没有人努力提出该建议并获得委员会批准
enum类
被创建为
enum
的现代版本。因为没有名字就不能工作,这对他们来说可能不是一个高优先级。@Nicolas同意为什么不直接做
autodeterminetype=[](bool v){enum{Type_ONE,Type_TWO};
autodeterminetype=[](bool v)->int{enum{Type_ONE,Type_TWO};
如果您使用的是C++11,为什么这应该是合法的?它甚至对常规函数都不合法:

typedef enum 
{ 
    Type_ONE, 
    Type_TWO 
}
teTypes;


void f() 
{
    auto determineType = []() -> teTypes 
    {
        return teTypes::Type_ONE;
    };
}