C++11对转换构造函数(converting constructor)的定义有什么改动?
C++11转换构造函数规则改动说明
你看到的定义差异对应的是C++11引入的初始化列表特性带来的规则更新:
未使用explicit说明符声明、且可通过单个参数调用的构造函数(直到C++11前)被称为转换构造函数。
你猜测的「带默认参数的多参数构造函数」不属于本次改动的范围,这类构造函数本身就符合「可通过单个参数调用」的要求,C++03标准下就已经属于转换构造函数,相关行为没有变化。
具体改动点
C++11新增了多参数列表初始化的隐式转换支持,同步更新了转换构造函数的定义:
未使用explicit说明符声明、且可以用任意长度的实参列表(包括初始化列表形式)调用的构造函数,都属于转换构造函数,不再限制只能通过单个参数调用。
符合要求的多参数构造函数场景
最典型的就是无默认参数的多参数无explicit构造函数,比如:
struct Rect { int width; int height; // C++11起属于转换构造函数,C++03不属于 Rect(int w, int h) : width(w), height(h) {} };
在C++11及之后的标准中,下面的隐式转换是合法的:
// 隐式调用Rect(int, int)构造函数完成参数转换 void draw_rect(Rect r) {} draw_rect({100, 200});
而同样的代码在C03中无法编译通过,因为C03不允许双参数构造函数触发隐式转换。
补充说明
- 多参数转换构造函数仅支持以大括号初始化列表的形式触发隐式转换,不能直接用逗号分隔的多个实参触发
- 构造函数如果带有
explicit修饰,哪怕是多参数场景也不能作为转换构造函数使用,只能显式调用 - C++03中已有的转换构造函数规则完全保留,不会影响旧代码的行为
内容的提问来源于stack exchange,提问作者davidbak
相关产品推荐
相关产品推荐

