Учитывая следующее:
#include <stdio.h>
class X;
class Y
{
public:
Y() { printf(" 1\n"); } // 1
// operator X(); // 2
};
class X
{
public:
X(int) {}
X(const Y& rhs) { printf(" 3\n"); } // 3
X(Y&& rhs) { printf(" 4\n"); } // 4
};
// Y::operator X() { printf(" operator X() - 2\n"); return X{2}; }
int main()
{
Y y{}; // Calls (1)
printf("j\n");
X j{y}; // Calls (3)
printf("k\n");
X k = {y}; // Calls (3)
printf("m\n");
X m = y; // Calls (3)
printf("n\n");
X n(y); // Calls (3)
return 0;
}
До сих пор так хорошо. Теперь, если я включаю оператор преобразования Y::operator X()
, я получаю это: -
X m = y; // Calls (2)
Я понимаю, что это происходит потому, что (2) меньше const, чем (3) и
поэтому предпочтительнее. Вызов конструктора X
отменяется
Мой вопрос: почему определение X k = {y}
не меняет свое поведение таким же образом? Я знаю, что = {}
является технически "инициализацией списка экземпляров", но в отсутствие конструктора, использующего тип initializer_list
, не возвращается ли это к "копированию инициализации"? т.е. - то же, что и для X m = y
Где дыра в моем понимании?