La inicialización uniforme no se puede copiar cuando el objeto no tiene miembros de datos
Al actualizar algún código para usar una inicialización uniforme, pensé que sería un sustituto moderno para el estilo de paréntesis del "estilo antiguo" ahora. Sé que este no es siempre el caso (ejemplo obvio,vector<int>
) pero he tropezado con otra diferencia que no entiendo.
class Object {
public:
Object() = default;
Object(const Object&) = default;
};
int main() {
Object o;
Object copy{o}; // error
Object copy2(o); // OK
}
no se compila en clang3.5 con el error: (también falla en gcc)
error: excess elements in struct initializer
Hay dos cambios diferentes paraObject
que hacen que esto funcione. Agregándole un miembro de datos o dándole un cuerpo de constructor de copia vacío
class Object {
private:
int i; // this fixes it
public:
Object() = default;
Object(const Object&) { } // and/or this fixes it as well
};
No veo por qué esto debería hacer una diferencia.