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 语句返回适当初始化的结构。我可以通过声明一个命名结构并初始化它,然后返回命名结构来做到这一点,但是如果我可以让编译器为我创建匿名结构(如上面的示例所示),那么它会更干净 - 它无法编译。这可以(合法地)发挥作用吗?或者实现我的目标的最干净的方法是什么?
如果我们查看C++ 标准草案的return语句第2段,这是完全有效的C++11代码:6.6.3
\n\n\n带有花括号初始化列表的 return 语句通过指定的初始化列表中的复制列表初始化 (8.5.4) 来初始化要从函数返回的对象\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 ]\nRun 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\nstruct 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}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1627 次 |
| 最近记录: |