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

时间:2018-10-30 09:43:55

标签: c++ constructor list-initialization explicit-constructor

cppreference about list-initialization的第二个意图(用于复制列表初始化)中,它表示:

  

copy-list-initialization(考虑显式和非显式构造函数,但只能调用非显式构造函数)

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

1 个答案:

答案 0 :(得分:4)

“考虑”和“被调用”之间的区别在于,“被考虑”表示候选函数参与了重载解析,而“被调用”意味着实际上被选为最佳匹配。明确地表示(无意使用双关语),这意味着,如果在复制列表初始化期间选择了显式构造函数,则将其禁止使用。例如,考虑以下情形:

font-weight: 900;

在这里,您正在使用隐式转换,其中显式构造函数将是更好的匹配,因此编译器正确地拒绝了它。您需要编写struct String { explicit String(int size); String(char const *value); }; String s = { 0 }; 来修复代码。现在想象一下,如果不考虑显式构造函数,而前者是合法代码。拥有一个不执行任何操作的显式构造函数会很奇怪。