复制/分配基本类型

gez*_*eza 2 c++ language-lawyer c++17

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

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

struct Foo {
    Foo(const Foo &);
};
Run Code Online (Sandbox Code Playgroud)

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

看看这个例子:

const Foo foo;
Foo f = foo;

const int a = 2;
int b = a;
Run Code Online (Sandbox Code Playgroud)

在这里,f = foo;odr-uses foo,作为拷贝构造函数需要参考,对吗?如果基本类型的副本有参考参数,那么b = a也会使用odr a.是这样的吗?如果没有,它是如何处理的?

Sto*_*ica 7

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

(17.8) - 否则,初始化对象的初始值是初始化表达式的(可能转换的)值.如有必要,将使用标准转换将初始化表达式转换为目标类型的cv非限定版本; 不考虑用户定义的转换.如果无法进行转换,则初始化不正确.当使用无法表示的值初始化位字段时,位字段的结果值是实现定义的.

在这种情况下,标准转换将是左值到右值的转换a.但这并没有使用a.我们在[basic.def.odr]中看到

2变量X,其名称显示为潜在评估表达 是ODR-使用,除非施加左值到右值转换到X产生一个常量表达式不调用任何非平凡函数,并且如果X是一个object,ex是表达式e的潜在结果集合的元素,其中左值到右值的转换应用于e,或者e是丢弃值表达式.

a是一个常量表达式,afor xexabove的替换表明它保留了另一半的条件,所以它不是经常使用的.