Могу ли я использовать агрегатный инициализатор для возврата структуры в C ++?

У меня есть функция, возвращающая именованную структуру, состоящую из двух целых, следующим образом:

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.
Я могу сделать это, объявив именованную структуру и инициализировав ее, а затем вернув именованную структуру,
но было бы чище, если бы компилятор создал для меня анонимные структуры, как в моем примере выше — который не компилируется.
Можно ли заставить это работать (законно)? Или какой самый чистый способ достижения моей цели?

4

Решение

Это совершенно верно C ++ 11 код, если мы посмотрим на проект стандарта C ++ раздел 6.6.3 Заявление о возврате параграф 2 говорит:

Оператор return со списком фигурных скобок инициализирует объект
или ссылка, которая должна быть возвращена из функции путем копирования-инициализации списка (8.5.4) из указанного списка инициализатора.

и это обеспечивает следующий пример:

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

мы можем видеть из живой пример что это работает, но не будет работать до C ++ 11 как мы можем видеть из этого живой пример.

Если вы используете gcc или же clang и вы не можете использовать C ++ 11 по какой-то причине у вас есть возможность использования составные литералы как продолжение в C ++ хотя это C99 особенность и как мы можем видеть из этого живой пример 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

Другие решения

Рассматривали ли вы добавить конструктор?

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);
}
}
0

По вопросам рекламы [email protected]