为什么不能在C++11或更高版本的函数声明中定义结构

Why can structs not be defined in a function declaration in C++11 or higher?

本文关键字:函数 声明 结构 定义 版本 C++11 不能 高版本 为什么      更新时间:2023-10-16

我试图实现的主要是从C++11中的一个函数返回一个未命名的结构。在C++14中,我可以通过定义内联函数并将auto作为返回类型来实现这一点,如下所示:

auto func()
{
    struct
    {
        int member;
    } ret;
    // set ret.member
    return ret;
}

然而,C++11不支持推导普通(非lambda)函数的返回类型,并且只有在内联定义时,这才适用于C++14。

我尝试了以下两种在函数声明中声明结构的变体:

auto func() -> struct { int member; };
struct { int member; } func();

这在C++11中根本不可能实现吗?如果是这样,是否有人知道这是故意禁止的,或者只是没有人想到这种自动推导类型的新用法(因为这只适用于分配给auto变量的函数返回值)?

最后,还有其他方法可以实现类似的目标吗?我知道std::tuple,但我想命名这些值;在我的用例中,structtype肯定只作为这一个函数的返回类型有用,那么为什么要命名它呢?

[dcl.fct]/p11:

类型不应在返回类型或参数类型中定义。

据我所知,这在C++11中并不新鲜。

类说明符类名{ }组成。一旦遇到右大括号,就会定义类。如果省略了类头名称,则该类未命名(§9)。类型说明符可以有类说明符部类型说明符不能(只允许简单类型说明符详细类型说明符类型名说明符cv限定符,§7.1.6)。因此,我认为不可能将类的定义放在后部返回类型中。

来源:N4140