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++ 的隐式转换有限制吗?如果是这样,那么隐式转换在什么上下文中发生?
隐式转换序列中仅允许一种用户定义的转换。(顺便说一句,标准转换没有这样的限制。)执行复制初始化,它需要两个用户定义的转换,一个 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