以下是给定的内容:
#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)比(3)'less const',因此更受欢迎。对X
构造函数的调用被省略了。
我的问题是,为什么定义X k = {y}
的行为没有以同样的方式改变?我知道 = {}
在技术上是'list copy initialization',但在没有接受initializer_list
类型的构造函数的情况下,是否会回归到'copy initialization'行为?也就是说-与X m = y
相同。
我的理解有哪些漏洞?