[英]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
,一個從Gadget
到Work
。
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
復制初始化; 其中只需要一個用戶定義的轉換(從Gadget
到Work
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.