基本类型的复制/分配



标准对基本类型的复制/赋值有何规定?

对于类类型,我们有复制构造函数、赋值运算符,它将右手边作为引用(它必须是引用,否则我们有无限递归(:

struct Foo {
Foo(const Foo &);
};

这是如何为基本类型定义的?

看看这个例子:

const Foo foo;
Foo f = foo;
const int a = 2;
int b = a;

这里,f = foo;odr使用foo,因为复制构造函数需要引用,对吧?。如果基本类型的副本有一个引用参数,那么b = a也将使用a。是这样吗?如果没有,如何处理?

我们可以跟踪它。从[dcl.init]开始。

(17.8(-否则,初始化对象的初始值是初始值设定项表达式的值(可能已转换(。如有必要,将使用标准转换来转换的cv不合格版本的初始值设定项表达式目的地类型;不考虑用户定义的转换。如果无法进行转换,初始化格式不正确。什么时候使用无法表示的值初始化位字段比特字段的结果值是实现定义的。

这种情况下的标准转换是a上的左值到右值转换。但这并不能使用a。因为我们在〔basic.def.odr〕中看到

2一个变量x,其名称显示为潜在的求值表达式exexodr使用,除非将左值应用于右值转换tox生成一个常量表达式,该表达式不会调用任何非平凡的函数,如果x是对象,则ex为表达式e的潜在结果,其中左值到右值的转换应用于e,或者e是丢弃的值表示

a是一个常数表达式,用a替换上面的xex表明它满足条件的另一半,因此不使用它。

最新更新