【问题标题】:Can I use an aggregate initializer to return a struct in C++?我可以使用聚合初始值设定项在 C++ 中返回结构吗?
【发布时间】:2013-12-12 07:12:39
【问题描述】:

我有一个函数返回一个由两个整数组成的命名结构,如下所示:

struct myStruct {int i; int j;};

myStruct myFunction(int myArg){
    switch (myArg) {
    case 0: return {1,2};
    case 1: return {2,3};
    default: return {4,5};
    }
}

我希望能够从我的 switch 语句中返回适当初始化的结构。 我可以通过声明一个命名结构并初始化它,然后返回命名结构来做到这一点, 但是,如果我可以让编译器像上面的示例那样为我创建匿名结构,那会更干净——它不会编译。 这可以(合法地)工作吗?或者实现我的目标的最干净的方法是什么?

【问题讨论】:

  • 如果你的编译器支持 C++11,应该可以。
  • 我真的不明白你为什么不想使用命名结构o.O你将如何访问返回的数据?
  • 你想要std::pair吗?
  • 您发布的代码是合法的;你得到编译器错误吗?如果是这样,请发布这些错误以及编译器版本。
  • 您可以简单地启用 C++11 或编写函数 make_myStruct()。

标签: c++ struct return anonymous


【解决方案1】:

如果我们查看draft C++ standard 部分6.6.3 返回语句 部分2,这是完全有效的C++11 代码说:

带有花括号初始化列表的 return 语句初始化对象 或从指定初始化列表中通过复制列表初始化 (8.5.4) 从函数返回的引用。

它提供了以下示例:

[ Example:
  std::pair<std::string,int> f(const char* p, int x) {
   return {p,x};
 }
—end example ]

我们可以从 a live example 看到它可以工作,但它不会在 C++11 之前工作,正如我们可以从 live example 看到的那样。

如果您使用gccclang 并且由于某种原因不能使用C++11,您可以选择使用compound literals 作为C++ 中的扩展 尽管它是一个 C99 功能,我们可以从 live example gcc 中看到警告:

警告:ISO C++ 禁止复合文字 [-Wpedantic]

另一种选择是将构造函数添加到您的结构中:

struct myStruct
{
    int i; int j;
    myStruct() : i(0), j(0) {} ;    
    myStruct(int x, int y) : i(x), j(y) {} ;
};

myStruct myFunction(int myArg){
    switch (myArg) {
    case 0: return myStruct(1,2) ;
    case 1: return myStruct(2,3) ;
    default: return myStruct(4,5) ;
    }
}

【讨论】:

    【解决方案2】:

    您是否考虑过添加构造函数?

    struct myStruct
    {
        int i;
        int j;
        myStruct(int x, int y) {i = x; j = y;}
        myStruct() {} // still want this, otherwise "myStruct x;" won't compile
    };
    myStruct myFunction(int myArg){
        switch (myArg) {
        case 0: return myStruct(1,2);
        case 1: return myStruct(2,3);
        default: return myStruct(4,5);
        }
    }
    

    【讨论】:

    • OP 明确需要聚合初始化器
    • -1 OP 明确声明他希望聚合初始化工作,这意味着 myStruct 必须保持聚合。此外,您的默认构造函数使成员未初始化,而另一个不使用初始化列表。
    • 他说他想要干净的代码,而不是在每个 case 子句中单独设置字段。那么如果默认构造函数为空怎么办,简单的struct myStruct{int i;int j;} 也没有初始化任何东西,我看没有人对此感到不安。
    • 好吧,如果您对聚合版本进行值初始化,则数据成员的初始化为零。使用您的版本,他们不会。我至少会修复默认构造函数。
    猜你喜欢
    • 2021-05-28
    • 1970-01-01
    • 2014-10-31
    • 2012-04-21
    • 2020-12-01
    • 2021-10-15
    • 1970-01-01
    • 2020-10-22
    • 2017-01-28
    相关资源
    最近更新 更多