在cppreference about list-initialization的第二个意图(用于复制列表初始化)中,它表示:
copy-list-initialization(考虑显式和非显式构造函数,但只能调用非显式构造函数)
构造函数被“考虑”和实际上被“调用”的区别到底是什么?为什么要考虑构造函数,无论如何都不能调用它?
答案 0 :(得分:4)
“考虑”和“被调用”之间的区别在于,“被考虑”表示候选函数参与了重载解析,而“被调用”意味着实际上被选为最佳匹配。明确地表示(无意使用双关语),这意味着,如果在复制列表初始化期间选择了显式构造函数,则将其禁止使用。例如,考虑以下情形:
font-weight: 900;
在这里,您正在使用隐式转换,其中显式构造函数将是更好的匹配,因此编译器正确地拒绝了它。您需要编写struct String {
explicit String(int size);
String(char const *value);
};
String s = { 0 };
来修复代码。现在想象一下,如果不考虑显式构造函数,而前者是合法代码。拥有一个不执行任何操作的显式构造函数会很奇怪。