标准对基本类型的复制/分配有何看法?
对于类类型,我们有复制构造函数,赋值运算符,该赋值运算符将右侧作为引用(必须是引用,否则我们将无限递归):
struct Foo {
Foo(const Foo &);
};
这是如何定义基本类型的?
看这个例子:
const Foo foo;
Foo f = foo;
const int a = 2;
int b = a;
在这里,f = foo;
会使用foo
,因为复制构造函数会使用引用,对吗?如果基本类型的副本具有参考参数,那么b = a
也将使用a
。是这样吗如果没有,该如何处理?
答案 0 :(得分:7)
我们可以追踪它。从[dcl.init]开始。
(17.8)-否则,正在初始化的对象的初始值 是初始化程序表达式的(可能是转换的)值。 如果需要,将使用标准转化来转换 初始值设定项表达式到cv的非限定版本 目标类型;不考虑用户定义的转换。如果 转换无法完成,初始化格式错误。什么时候 使用无法代表的值初始化位字段 位字段的结果值是实现定义的。
在这种情况下,标准转换将是a
上的左值到右值转换。但这并不奇怪使用a
。我们在[basic.def.odr]
2变量 x ,其名称显示为可能评估的表达式 除非应用左值到右值转换,否则 ex 会被 ex 使用 到 x 会产生一个常量表达式,该常量表达式不会调用任何非平凡的 函数,并且如果 x 是一个对象,则 ex 是该集合的一个元素 e 表达式的潜在结果,其中 左值到右值转换应用于 e ,或者 e 是一个废弃值 表达。
a
是一个常量表达式,用a
代替x
和ex
证明了它拥有条件的另一半,因此不被滥用。