una ternario operador linea elvis ejemplo condicional c++ visual-c++ c++11 initialization ternary-operator

c++ - linea - ¿Por qué braced-init-list no se puede usar en el operador ternario?



operador ternario ejemplo c++ (2)

Mi compilador es el último VC ++ 2013 RC.

int f(bool b) { return {}; // OK return b ? 1 : { }; // C2059: syntax error : ''{'' return b ? 1 : {0}; // C2059: syntax error : ''{'' return b ? {1} : {0}; // C2059: syntax error : ''{'' }

¿Por qué braced-init-list no se puede usar en el operador ternario?

¿Este comportamiento está definido como mal formado por el estándar de C ++, o simplemente como un error del compilador de VC ++?


Bueno, esto es lo que dice la norma sobre la lista inicial arrinconada (8.5.3.1):

La inicialización de la lista se puede usar

  • como el inicializador en una definición variable (8.5)
  • como el inicializador en una nueva expresión (5.3.4)
  • en una declaración de devolución (6.6.3)
  • como argumento de función (5.2.2)
  • como un subíndice (5.2.1)
  • como argumento para una invocación de constructor (8.5, 5.2.3)
  • como inicializador para un miembro de datos no estático (9.2)
  • en un mem-initializer (12.6.2)
  • en el lado derecho de una tarea (5.17)

Como esto no menciona el operador condicional, supongo que tu compilador es el correcto. También tenga en cuenta que el operador condicional espera expresiones en ambos lados de : (5.16), y por lo que yo entiendo, un inicializador de llaves no es una expresión.


Es un error de sintaxis Una lista inicial arrinconada no es una expresión, y no tiene una categoría de tipo o valor. braced-init-list está disponible en varias ubicaciones en la gramática de C ++, y los operandos de expresión condicional no son una de esas ubicaciones. Por lo tanto, su código ni siquiera analiza.

Si quieres hacer esto:

struct T { ... }; T f(bool b) { return b ? {i,j,k} : {x,y}; }

en cambio, podrías hacer esto:

T f(bool b) { return b ? T{i,j,k} : T{x,y}; }

y creo que, aunque esto requiere un constructor de movimiento, no lo usaría y RVO se activaría.

Alternativamente, usted podría, por supuesto, hacer esto:

T f(bool b) { if (b) return {i,j,k}; else return {x,y}; }

para obtener todas las ventajas de la inicialización de la lista.