[英]Behaviour of explicit copy constructor
我有以下代碼:
#include <iostream>
struct A {
A(int x=1, int y=1) : x(x), y(y) { }
A(const A& other) : x(other.x), y(other.y) { }
operator bool() const { return !x && !y; }
friend std::ostream& operator<<(std::ostream& os, const A& a) {
os << a.x << "," << a.y << "\n";
return os;
}
int x;
int y;
};
int main(int argc, char const *argv[]) {
A const A10x10(10, 10);
A a;
std::cout << a;
A aa = A10x10;
std::cout << aa;
return 0;
}
以上打印:
1,1
10,10
當我將復制構造函數更改為顯式(即explicit A(const A& other);
)時,我得到:
1,1
0,1
我在(顯式)復制構造函數中放置了一個 print 語句,實際上它沒有被調用。 為什么會這樣? explicit
有什么區別?
我正在使用 C++17,用 Clang10 編譯。
這個:
A aa = A10x10;
執行復制初始化。 復制初始化通過將 object 轉換為正在初始化的 object 的類型來工作。 但是,復制初始化是通過隱式轉換來實現的。 並且隱式轉換不能調用explicit
構造函數。
即使它是復制構造函數。
現在無論如何,你會認為你會得到一個編譯錯誤。 但你沒有。 為什么? 因為A
可以通過用戶定義的轉換隱式轉換為bool
。 並且bool
可以通過標准轉換轉換為int
。 A
實際上可以從int
類型的單個值構造。 雖然隱式轉換只允許一次用戶定義的轉換,但它確實允許用戶定義的轉換后跟標准轉換。
所以這就是發生的事情。 這就是為什么當復制構造函數是explicit
時aa
中的第一個值是 0 的原因。
一般來說,總是讓operator bool
explicit
。 永遠不要使復制構造函數explicit
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.