Я не знаю, это ошибка компилятора (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;
}
фигурные скобки как таковой не формировать выражения (хотя все элементы из списка инициализатора есть выражения). приготовился-INIT-лист это просто языковая конструкция, которую можно использовать для инициализации в контекстах, указанных в п. 8.5.4 стандарта C ++ 11 (включая return
заявления).
Если вы хотите, чтобы ваш return
оператор для компиляции и все еще использовать троичный оператор а также инициализации списка, вы должны переписать его следующим образом:
return { i == 3 ? i + 2 : i };
Обратите внимание, однако, что вышеупомянутое не является необходимым. Как упомянул Дэвид Родригес — dribeas в комментариях), вы могли бы просто отказаться от использования списка инициализации. Это будет работать одинаково хорошо:
return i == 3 ? i + 2 : i;
Других решений пока нет …