标准对基本类型的复制/赋值有何规定?
对于类类型,我们有复制构造函数、赋值运算符,它们将右侧作为引用(它必须是引用,否则我们会无限递归):
struct Foo {
Foo(const Foo &);
};
这是如何定义基本类型的?
看这个例子:
const Foo foo;
Foo f = foo;
const int a = 2;
int b = a;
Here, f = foo;
网上争议解决用途foo
,因为复制构造函数需要引用,对吧?如果基本类型的副本有一个引用参数,那么b = a
会使用 ODRa
以及。是这样吗?如果不是,如何处理?
我们可以追踪它。从 [dcl.init] 开始。
(17.8) https://timsong-cpp.github.io/cppwp/n4659/dcl.init#17.8- 否则,正在初始化的对象的初始值
是初始化表达式的(可能已转换)值。
如有必要,将使用标准转换来转换
初始化表达式为 cv 未限定版本
目的地类型;不考虑用户定义的转换。如果
无法完成转换,初始化格式错误。什么时候
使用无法表示的值初始化位字段,
位字段的结果值是实现定义的。
在这种情况下,标准转换是左值到右值的转换a
。但这并不使用odra
。我们在 [basic.def.odr] 中看到
2 https://timsong-cpp.github.io/cppwp/n4659/expr.const#2一个变量x其名称显示为可能评估的表达式ex被 ODR 使用的是ex除非应用左值到右值转换
到x产生一个不调用任何非平凡的常量表达式
函数,并且,如果x是一个对象,ex是集合中的一个元素
表达式的潜在结果e,其中
左值到右值的转换应用于e, or e是一个废弃值
表达。
a
是一个常量表达式和替换a
for x
and ex
上面演示了它满足条件的另一半,因此它不被使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)