我有一个函数返回一个由两个整数组成的命名结构,如下所示:
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语句中返回适当初始化的结构。 我可以通过声明一个命名结构并初始化它然后返回命名结构来做到这一点, 但是如果我可以让编译器为我创建匿名结构,就像我上面的例子那样会更清晰 - 它不能编译。 这可以合法地工作吗?或者实现目标的最简洁方法是什么?
答案 0 :(得分:1)
如果我们查看draft C++ standard部分6.6.3
返回语句段 2,这是完全有效的 C ++ 11 代码说:
带有braced-init-list的return语句初始化对象 或者引用从指定的初始化列表中通过copy-list-initialization(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中看到的那样。
如果您使用的是gcc
或clang
,并且出于某种原因无法使用 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) ;
}
}
答案 1 :(得分:0)
您是否考虑过添加构造函数?
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);
}
}