我可以使用聚合初始值设定项返回 C++ 中的结构吗?

Ste*_*enD 5 c++ struct anonymous return

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

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};
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*our 1

如果我们查看C++ 标准草案的return语句2段,这是完全有效的C++11代码:6.6.3

\n\n
\n

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

\n
\n\n

它提供了以下示例:

\n\n
[ Example:\n  std::pair<std::string,int> f(const char* p, int x) {\n   return {p,x};\n }\n\xe2\x80\x94end example ]\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们可以从一个实际示例中看到它可以工作,但在C++11之前它不能工作,正如我们从这个实际示例中看到的那样。

\n\n

如果您正在使用gccorclang并且由于某种原因无法使用C++11,您可以选择使用复合文字作为C++中的扩展,即使它是C99功能,正如我们从这个实时示例 中看到的gcc警告:

\n\n
\n

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

\n
\n\n

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

\n\n
struct myStruct\n{\n    int i; int j;\n    myStruct() : i(0), j(0) {} ;    \n    myStruct(int x, int y) : i(x), j(y) {} ;\n};\n\nmyStruct myFunction(int myArg){\n    switch (myArg) {\n    case 0: return myStruct(1,2) ;\n    case 1: return myStruct(2,3) ;\n    default: return myStruct(4,5) ;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n