4

在第二个意图(用于复制列表初始化)中关于列表初始化的 cppreference中,它说:

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

构造函数被“考虑”和实际“调用”的区别到底是什么。为什么要考虑构造函数,它可能无论如何都不会被调用?

4

1 回答 1

4

“considered”和“called”之间的区别在于,“considered”意味着候选函数参与重载决议,而“called”意味着它实际上被选为最佳匹配。明确地(双关语不是有意的),这意味着如果在复制列表初始化期间选择了显式构造函数,则它是被禁止的。例如考虑这种情况:

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

String s = { 0 };

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

于 2018-10-30T10:01:56.903 回答