C++:考虑但不调用构造函数的特殊性

C++: Particularities of considering but not calling constructors

本文关键字:调用 构造函数 特殊性 C++      更新时间:2023-10-16

关于第二个意图中的列表初始化(用于复制列表初始化(的cpppreference上说:

复制列表初始化(同时考虑显式和非显式构造函数,但只能调用非显式构造器(

构造函数被"考虑"和实际被"调用"究竟有什么区别。为什么要考虑构造函数,它可能无论如何都不会被调用?

"consided"answers"called"之间的区别在于,"considered"表示候选函数参与重载解析,而"called(表示它实际上被选为最佳匹配。显式地(双关语不是有意的(,这意味着如果在复制列表初始化期间选择了显式构造函数,那么它是被禁止的。例如,考虑以下场景:

struct String {
explicit String(int size);
String(char const *value);
};
String s = { 0 };

这里,您使用的是隐式转换,其中显式构造函数会更好地匹配,因此编译器会正确地拒绝它。您需要编写String{ 0 }来修复代码。现在想象一下,如果显式构造函数是而不是,并且前者是合法代码。如果有一个显式构造函数什么都不做,那将是非常奇怪的。