Copiar la inicialización con el operador de conversión

Sarvesh:

No hay código en copy_initialization

struct A 
{
  operator int() { return 12;}
};

struct B 
{
  B(int) {}
};
int main()
{
 ....
    A a;
    B b0 = 12;
//    B b1 = a; //< error: conversion from 'A' to non-scalar type 'B' requested
    B b2{a};        // < identical, calling A::operator int(), then B::B(int)
    B b3 = {a};     // <
    auto b4 = B{a}; // <
}

Ahora la pregunta es

  • ¿Cómo funciona la inicialización directa en caso de b2? Puede dirigir la inicialización del operador de conversión de llamada?
  • ¿Por Copiar inicialización falla por b1? Una forma implícita se debe convertir a int y el constructor de B puede ser llamado.
  • b3 es también Copia de inicialización, pero funciona. ¿Porque?
Nicol Bolas :

Esto es muy simple: convertibilidad implícita (para los tipos definidos por el usuario) no es un transitivo propiedad en C ++. Es decir, mientras que Aes convertible a int, y intes convertible a B, esto no significa por sí mismo que Aes convertible a B. No hay una secuencia conversión implícita válida desde el Aque B, por lo que Ano se puede convertir a B.

Copia de inicialización requiere convertibilidad implícita entre el tipo de la expresión de inicialización y el tipo de ser inicializado. Dado que Ano es convertible en B, b1no se compila.

Cada vez que vea {}como parte de una inicialización como esta, entonces esto significa que el objeto al que se aplica a va a sufrir algún tipo de lista de inicialización, que es un proceso diferente de las otras formas de inicialización.

b2no realiza "inicialización directa". Se lleva a cabo directamente la lista de inicialización, que es una de las dos formas de lista de inicialización. Las reglas de la lista de inicialización, en este caso, con el tiempo se reducen a la utilización de resolución de sobrecarga en el conjunto de constructores para B. Hay un constructor de Bque se puede llamar con una A, ya que la llamada puede ocurrir a través de la conversión implícita de la Aque una int.

b3no es "copia de inicialización"; es copia lista de inicialización, que no tiene absolutamente nada que ver con "copia de inicialización". Copia-list-inicialización es idéntica a dirigir-list-inicialización con exactamente dos excepciones, ninguno de los cuales se aplican a este caso. Por lo tanto, hace lo mismo que b2.

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=377505&siteId=1
Recomendado
Clasificación