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

C++ C++;:考虑但不调用构造函数的特殊性,c++,constructor,list-initialization,explicit-constructor,C++,Constructor,List Initialization,Explicit Constructor,在第二个文本中(用于副本列表初始化),它表示: 复制列表初始化(同时考虑显式和非显式构造函数,但只能调用非显式构造函数) 构造函数被“考虑”和实际被“调用”的区别到底是什么。为什么要考虑构造函数,这可能不是所谓的。 < P>“考虑”和“调用”之间的区别是“考虑”意味着候选函数参与过载解决,而“调用”意味着它实际上被选为最佳匹配。显式(双关语不适用),这意味着如果在复制列表初始化期间选择了显式构造函数,则禁止使用它。例如,考虑这种情况: struct String { explicit Str

在第二个文本中(用于副本列表初始化),它表示:

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

构造函数被“考虑”和实际被“调用”的区别到底是什么。为什么要考虑构造函数,这可能不是所谓的。

< P>“考虑”和“调用”之间的区别是“考虑”意味着候选函数参与过载解决,而“调用”意味着它实际上被选为最佳匹配。显式(双关语不适用),这意味着如果在复制列表初始化期间选择了显式构造函数,则禁止使用它。例如,考虑这种情况:

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

String s = { 0 };

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

我假设这意味着显式构造函数也参与重载解析,但是如果这种构造函数恰好是最佳匹配,程序的格式不正确。我想这意味着重载解析在选择重载之前并不关心它是否显式。“为什么有不同形式的列表初始化?”-这实际上是一个很好的问题(尽管它可能不适合这种格式)。C++已经有11种(?)形式的初始化,没有特别的原因(可能更多的是在新的标准中出现)。有人需要限制标准委员会。这个问题在这里部分重复,你可以找到好的信息,至少与你的上一个问题相关。请阅读:@Jules谢谢,删除了附加问题。那么,当调用显式构造函数时,第一个构造函数是合法调用的,如果不考虑显式构造函数,第二个构造函数是合法调用的?如果第一个构造函数在初始示例中不存在,它会编译吗?