返回匿名结构

sup*_*per 1 c++ struct c++17

看来您可以通过struct以下方式返回未命名的名称:

auto foo() {
    struct {
        int bar;

        int square() {
            return bar * bar;
        }
    } a { 7 };
    return a;
}
Run Code Online (Sandbox Code Playgroud)

无论如何,没有冗余变量名a(匿名)吗?

Max*_*hof 5

我不知道这个练习的意义是什么,所以这里有一个答案,从技术上讲可以满足您的要求:

auto helper()
{
    struct {
        int x;
    } a {0};
    return a;
}

decltype(helper()) foo()
{
    return {8};
}
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/zA8C1V

  • 该结构未命名。

  • foo 不返回命名变量。

当然,这简直是荒谬的——人们只会命名结构而不是这个decltype傻瓜。

  • @Fuleeish 主要的区别是我必须克服懒惰的程度才能输入这个不完全严肃的答案。 (5认同)

Vla*_*cow 5

对于初学者,C ++没有定义匿名结构。我认为您的意思是未命名的结构。

根据C ++标准,return语句的定义类似于(8.6 Jump语句)

return expr-or-braced-init-listopt ;
Run Code Online (Sandbox Code Playgroud)

因此,您不能在return语句中使用声明。如果是这样,则需要初步声明将返回的结构类型的对象。

  • “我认为您的意思是未命名的结构。”我不这么认为。他们演示了返回未命名结构的工作方式。他们特别想摆脱变量,即他们希望结构是匿名的。即使在具有匿名结构的C中,它们也仅作为成员存在。 (3认同)

Lig*_*ica 5

不,这是不可能的。

您可以得到的最接近的结果是使用功能样式的强制转换创建临时文件,并使用C99样式的范围初始化器。GCC允许在C ++模式下将此作为扩展:

#include <iostream>
#include <string>

auto foo() {
    return (struct {
        int bar;

        int square() {
            return bar * bar;
        }
    }) { 7 };
}
Run Code Online (Sandbox Code Playgroud)

……但这不是可移植的(并且会警告)。

如果没有括号7,扩展名不会被触发,您将返回标准代码,在标准代码中,在cast中定义类型是非法的

不必编写晦涩的代码,而是为您的类型命名并为对象命名。您的读者将感谢您。