c++ - remix - smart contracts ethereum
¿Por qué se llama copiar al constructor en lugar de al constructor de conversión? (1)
B b2 = a;
Esto se conoce como Inicialización de Copia .
Lo hace a continuación:
- Cree un objeto de tipo
B
desdea
utilizandoB (const A& a)
. - Copie el objeto temporal creado en
b2
utilizandoB (const B& b)
. - Destruye el objeto temporal usando
~B()
.
El error que recibe no está en el paso 1 sino en el paso 2.
¿Dónde está esto en la norma?
C ++ 03 8.5 Inicializadores
Para 14:
....
- Si el tipo de destino es un tipo de clase (posiblemente cv-calificado):
...
...
- De lo contrario (es decir, para los casos de inicialización de copia restantes), las secuencias de conversión definidas por el usuario que pueden convertirse del tipo de origen al tipo de destino o (cuando se usa una función de conversión) a una clase derivada del mismo se enumeran como se describe en 13.3 .1.4, y el mejor es elegido por resolución de sobrecarga (13.3). Si la conversión no se puede realizar o es ambigua, la inicialización no se ha realizado correctamente. La función seleccionada se llama con la expresión inicializadora como su argumento; Si la función es un constructor, la llamada inicializa un temporal del tipo de destino. El resultado de la llamada (que es el temporal para el caso del constructor) se utiliza para inicializar directamente, de acuerdo con las reglas anteriores, el objeto que es el destino de la inicialización de la copia. En ciertos casos, se permite una implementación para eliminar la copia inherente a esta inicialización directa mediante la construcción del resultado intermedio directamente en el objeto que se está inicializando; ver 12.2, 12.8.
Así que básicamente este código:
class A {
};
class B {
B (const B& b) {}
public:
B (){}
B (const A& a) {}
};
int main()
{
A a;
B b1(a); //OK
B b2 = a; //Error
}
solo genera un error para B b2 = a
. Y ese error es
error: ''B :: B (const B &)'' es privado
¿Por qué está intentando llamar al constructor de copia además del constructor de conversión directa?
Del mensaje de error se desprende claramente que se crea una B
temporal que luego se utiliza para la construcción de copias, pero ¿por qué? ¿Dónde está esto en la norma?