簡體   English   中英

顯式復制構造函數的行為

[英]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類型的單個值構造。 雖然隱式轉換只允許一次用戶定義的轉換,但它確實允許用戶定義的轉換后跟標准轉換。

所以這就是發生的事情。 這就是為什么當復制構造函數是explicitaa中的第一個值是 0 的原因。

一般來說,總是operator bool explicit 永遠不要使復制構造函數explicit

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM