C++ 为什么不能在C+;中的函数声明中定义结构+;11岁或以上?

C++ 为什么不能在C+;中的函数声明中定义结构+;11岁或以上?,c++,c++11,c++14,C++,C++11,C++14,我试图实现的主要是从C++11中的函数返回一个未命名的结构。在C++14中,我可以通过定义内联函数并将auto作为返回类型来实现这一点,如下所示: auto func() { struct { int member; } ret; // set ret.member return ret; } 但是,C++11不支持推断普通(非lambda)函数的返回类型,这仅在C++14中内联完成定义时有效 我尝试了以下两种在函数声明中声明结构的变

我试图实现的主要是从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
,但我想命名这些值;在我的用例中,结构类型肯定只作为这一个函数的返回类型有用,那么为什么命名它呢?

类说明符由类头名称和
{}
组成。遇到右大括号后,将定义该类。如果省略了类头名称,则该类未命名(§9)。类型说明符可以有类说明符,但后面的类型说明符不能(只允许使用简单类型说明符、详细类型说明符、类型名说明符和cv限定符,§7.1.6)。出于这个原因,我认为不可能将类的定义放在尾部返回类型中

资料来源:N4140

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


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

这并不是故意禁止的;它只是还没有被设计出来,委员会担心在没有实际经验的情况下围绕
auto
做太多的规范。记住
throw
规范或外部模板的失败。请记住,C++11将在2009年之前发布,所以它们已经很晚了。C++11和14被认为更像是一揽子交易。后者在许多方面是前者的补充。因此,这更多的是一个你不想让它进入第一个“一半”的功能的例子。但是,它在规范中是不允许的,还是应该
struct{int member;}
是函数的有效返回类型(通常,不仅在C++11和更高版本中),编译器开发人员只是没有考虑到这种可能性(因为在C++11之前它是无用的)?标准中允许使用未命名的结构(这就是您所拥有的)据我所知,它应该是被允许的。你以前不能返回它的唯一原因是因为没有推导出的返回类型。我认为如果没有兼容C++14的编译器,你不能完全做你想做的事情。qeadz:是的,当然,未命名的结构基本上是被允许的。我问题中第二个代码块的两个声明不允许工作吧,否则我就不会问这个问题了。它们都被g++4.9.2和clang 3.5.1拒绝了,不管我是使用
-std=c++11
还是
-std=c++14
。我找不到N4140文档,只有一个对N4296的引用,它似乎是同一文档的修订版本(第四个文档).你能看一看并指出相关事物的定义吗?@jP_wanN从