Равномерная инициализация с возвращением тернарного оператора из функции

Я не знаю, это ошибка компилятора (gcc 4.8 в Arch Linux) или проблема со стандартом, но приведенный ниже код не компилируется. Почему getFoo1 разрешен, но не getFoo2?

struct Foo {
int _i;
Foo(int i):_i(i) { }
};

Foo getFoo1(int i) {
if(i == 3) {
return { i + 2 };
} else {
return { i };
}
}

Foo getFoo2(int i) {
return i == 3 ? { i + 2 } : { i };
}

int main() {
auto foo1 = getFoo1(3); //fine
auto foo2 = getFoo2(3); //oops
return 0;
}

2

Решение

фигурные скобки как таковой не формировать выражения (хотя все элементы из списка инициализатора есть выражения). приготовился-INIT-лист это просто языковая конструкция, которую можно использовать для инициализации в контекстах, указанных в п. 8.5.4 стандарта C ++ 11 (включая return заявления).

Если вы хотите, чтобы ваш return оператор для компиляции и все еще использовать троичный оператор а также инициализации списка, вы должны переписать его следующим образом:

return { i == 3 ? i + 2 : i };

Обратите внимание, однако, что вышеупомянутое не является необходимым. Как упомянул Дэвид Родригес — dribeas в комментариях), вы могли бы просто отказаться от использования списка инициализации. Это будет работать одинаково хорошо:

return i == 3 ? i + 2 : i;
4

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

Других решений пока нет …

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