Este código me dá erro do compilador: "esperava uma expressão".
std::array< std::string, 3 > candidates = useOutname ? { "%O.log", "%O_.log", "_%O.log" } : { "%J.log", "%J_.log", "_%J.log" };
Se mudar para uma instrução if else simples, funciona:
std::array< std::string, 3 > candidates;
if (useOutname) {
candidates = { "%O.log", "%O_.log", "_%O.log" };
}
else {
candidates = { "%J.log", "%J_.log", "_%J.log" };
}
Gostaria de saber por que usar o operador ternário causa erro aqui? É por causa da inicialização das chaves?
O operador ternário (? : ) em C++ requer que os ramos verdadeiro e falso sejam expressões do mesmo tipo. Mas { "%O.log", "%O_.log", "_%O.log" } é um
braced-init-list
, que não é uma expressão. É uma sintaxe especial tratada pela inicialização da lista de cópias. Portanto, você não pode usar brace-init-lists diretamente dentro de um operador ternário como este...Se você realmente quer uma linha usando o operador ternário, uma opção que você pode fazer é tornar ambos os ramos expressões reais do mesmo tipo, como: