簡體   English   中英

在初始化 class 類型時,C++ 可以執行多少次隱式轉換才能將一種用戶定義類型轉換為另一種?

[英]How many implicit conversions can C++ do to convert one user-defined type to another when initializing class types?

#include <iostream>

struct Gadget
{
  Gadget() { puts("Gadget default"); }
  Gadget(char const *a) { puts("Gadget-const char* constructor"); }
  Gadget(Gadget const &other) { puts("Gadget copy"); }
  ~Gadget() { puts("\nGadget destruction"); }
};

struct Work
{
  Work() { puts("default"); }
  Work(const Gadget &a) { puts("Work-Gadget constructor"); }
  // Work(char const *a) { puts("Work-const char* constructor"); }
  Work(Work const &other) { puts("copy"); }
  ~Work() { puts("\nWork destruction"); }
};

int main()
{
  using namespace std;
  Work w = "std";  // error here;
}

Work w("std"); // works fine
Work w = Gadget("std"); // works fine
Work w = Work("std"); // works fine

c++ 可以做的隱式轉換有什么限制嗎? 如果是這樣,那么在什么情況下會發生隱式轉換?

隱式轉換序列中只允許進行一次用戶定義的轉換 (順便說一句,標准轉換沒有這樣的限制。) Work w = "std"; 執行 復制初始化,它需要兩個用戶定義的轉換,一個從char const *Gadget ,一個從GadgetWork

Work w("std"); 進行直接初始化,只需要進行一次用戶自定義的轉換(從char const *Gadget ),然后將轉換后的Gadget直接傳遞給Work的構造函數來構造w

復制初始化中的隱式轉換必須直接從初始化器中產生T ,而例如直接初始化需要從初始化器到T構造函數的參數的隱式轉換。

Work w = Work("std"); ,臨時Work被顯式構造為Work("std") (其工作原理如上所述),然后w從臨時Work復制初始化。

Work w = Gadget("std"); ,臨時Gadget被顯式構造為Gadget("std") ,然后w從臨時Gadget復制初始化; 其中只需要一個用戶定義的轉換(從GadgetWork )。

暫無
暫無

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

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