考慮下面的拷貝初始化:形式 '= {}'
#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)和 因此優選。對X
構造函數的調用被取消
我的問題是,爲什麼定義X k = {y}
以相同的方式改變其行爲?我知道= {}
在技術上是'列表副本初始化',但是在沒有構造函數的情況下使用initializer_list
類型,是不是會恢復'複製初始化'行爲?即 - 與X m = y
我的理解在哪裏?
對不起 - 我搞砸了最小化代碼 - 更正(希望) – Rich
使用Exaxt編譯器?我知道在某些編譯器中與此相鄰的代碼不一致。 – Yakk
改進了這個例子。我已經在11,14和17模式下用cppreference.com(clang 3.8)上的編譯器工具試過了。結果相同 – Rich