复制/分配基本类型

时间:2018-11-22 10:41:34

标签: c++ language-lawyer c++17

标准对基本类型的复制/分配有何看法?

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

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

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

看这个例子:

const Foo foo;
Foo f = foo;

const int a = 2;
int b = a;

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

1 个答案:

答案 0 :(得分:7)

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

  

(17.8)-否则,正在初始化的对象的初始值   是初始化程序表达式的(可能是转换的)值。   如果需要,将使用标准转化来转换   初始值设定项表达式到cv的非限定版本   目标类型;不考虑用户定义的转换。如果   转换无法完成,初始化格式错误。什么时候   使用无法代表的值初始化位字段   位字段的结果值是实现定义的。

在这种情况下,标准转换将是a上的左值到右值转换。但这并不奇怪使用a。我们在[basic.def.odr]

中看到了
  

2变量 x ,其名称显示为可能评估的表达式   除非应用左值到右值转换,否则 ex 会被 ex 使用   到 x 会产生一个常量表达式,该常量表达式不会调用任何非平凡的   函数,并且如果 x 是一个对象,则 ex 是该集合的一个元素    e 表达式的潜在结果,其中   左值到右值转换应用于 e ,或者 e 是一个废弃值   表达。

a是一个常量表达式,用a代替xex证明了它拥有条件的另一半,因此不被滥用。