2013-05-19 4 views
2

Я не знаю, является ли это ошибкой компилятора (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; 
} 

ответ

4

Брекеты сами по себе не образуют выражения (хотя все элементы из списка инициализатора являются выражениями). A braced-init-list - это просто языковая конструкция, которая может быть использована для инициализации в контекстах, указанных в § 8.5.4 Стандарта C++ 11 (включая операторы return).

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

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

Обратите внимание, однако, что выше не обязательно. As mentioned by David Rodriguez - dribeas in the comments), вы можете просто отказаться от использования инициализации списка. Это будет работать одинаково хорошо:

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

Отличная альтернатива. – chris

+1

В качестве альтернативы, отбросьте '{}' вообще. –

+0

@ DavidRodríguez-dribeas: Right –

 Смежные вопросы

  • Нет связанных вопросов^_^