在初始化类类型时,C++ 可以执行多少次隐式转换来将一种用户定义类型转换为另一种类型?

Veg*_*eta 4 c++ implicit-conversion

#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;
}
Run Code Online (Sandbox Code Playgroud)

Work w("std"); // works fine
Work w = Gadget("std"); // works fine
Work w = Work("std"); // works fine
Run Code Online (Sandbox Code Playgroud)

c++ 的隐式转换有限制吗?如果是这样,那么隐式转换在什么上下文中发生?

son*_*yao 6

隐式转换序列中仅允许一种用户定义的转换。(顺便说一句,标准转换没有这样的限制。)执行复制初始化,它需要两个用户定义的转换,一个 from to ,一个 from to 。Work w = "std";char const *GadgetGadgetWork

Work w("std");执行直接初始化,只需要一次用户定义的转换(从char const *到),然后将转换后的值传递给直接构造函数 构造函数。GadgetGadgetWorkw

复制初始化中的隐式转换必须T直接从初始化程序生成,而直接初始化则期望从初始化程序到 的T构造函数的参数进行隐式转换。

在 中Work w = Work("std");,临时对象Work显式构造为Work("std")(其工作原理如上所述),然后w从临时对象进行复制初始化Work

在 中Work w = Gadget("std");,临时对象Gadget显式构造为Gadget("std"),然后w从临时对象进行复制初始化Gadget;其中只需要一种用户定义的转换(从Gadget到)。Work