Pregunta Si se declaran dos objetos en una sola línea, ¿en qué orden se construyen?


Digamos que una clase ha sido definida como

class A {
//.....
};

y ahora estoy creando dos objetos como

A a,b;

En qué orden están a y b ¿creado? ¿Está definido por el estándar?


63
2018-02-22 18:26


origen


Respuestas:


De 8 declaradores [dcl.decl] 3:

Cada declarador de inicio en una declaración se analiza por separado como si estuviera en una declaración por sí mismo.

Continúa para decir

Una declaración con varios declaradores suele ser equivalente a la correspondiente secuencia de declaraciones, cada una con un único   declarador Es decir    T D1, D2, ... Dn;   generalmente es equivalente a    T D1; T D2; ... T Dn;   dónde T es un decl-specifier-seq y cada Di es un iniciador-declarador. Una excepción ocurre cuando un nombre introducido por uno de   los declaradores esconden un nombre de tipo utilizado por los especificadores de declinación, de modo que cuando se usan los mismos especificadores de declinación en una subsiguiente   declaración, no tienen el mismo significado.

Puedes decir que están construidos de izquierda a derecha.


78
2018-02-22 18:35



El capítulo 8 de las especificaciones de C ++ [dcl.decl], dice:

Cada init-declarator en una declaración se analiza por separado como si   estaba en una declaración en sí mismo. (100)

La nota al pie (100) continúa para decir:

(100) Una declaración con varios declaradores suele ser equivalente a la   secuencia correspondiente de declaraciones cada una con un solo declarador.   Es decir

T D1, D2, ... Dn;

generalmente es equivalente a

 T D1; T D2; ... T Dn;

... y luego nombra algunas excepciones, ninguna de las cuales se aplica en casos tan simples.

Entonces, la respuesta a su pregunta es que los objetos están construidos en el orden en que los enumera. Y no, no es un operador de coma.


52
2018-02-22 18:36



La orden es la orden escrita, de izquierda a derecha. Además, no es el operador de coma, sino simplemente una lista de declaradores. Cuando se utiliza un operador de coma definido por el usuario, el orden de hecho no está especificado.

Ver operador de coma y declaradores.


11
2018-02-22 18:31



un se creará primero y luego segundo.

Comas en este caso se usará como separadores y no como operadores.

Por ejemplo de wikipedia:

    /**
      *  Commas act as separators in this line, not as an operator.
      *  Results: a=1, b=2, c=3, i=0
      */
     int a=1, b=2, c=3, i=0;

8
2018-02-22 18:30



Estándares:

Declaradores [dcl.decl]:
  Cada declarador de inicio en una declaración se analiza por separado como si estuviera en una declaración por sí mismo.

Ejemplo:

class A {
public:
    A(std::string const &s): name(s) 
    { 
        std::cout << "I am " << name << '\n'; 
    }
    std::string name;
};

auto main() -> int
{
    A a("a"), b("b");
}

Salida:

I am a
I am b

6
2018-02-22 22:03