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.是这样的吗?如果没有,它是如何处理的?
我们可以追踪它.从[dcl.init]开始.
(17.8) - 否则,初始化对象的初始值是初始化表达式的(可能转换的)值.如有必要,将使用标准转换将初始化表达式转换为目标类型的cv非限定版本; 不考虑用户定义的转换.如果无法进行转换,则初始化不正确.当使用无法表示的值初始化位字段时,位字段的结果值是实现定义的.
在这种情况下,标准转换将是左值到右值的转换a.但这并没有使用a.我们在[basic.def.odr]中看到
2变量X,其名称显示为潜在评估表达 前是ODR-使用前,除非施加左值到右值转换到X产生一个常量表达式不调用任何非平凡函数,并且如果X是一个object,ex是表达式e的潜在结果集合的元素,其中左值到右值的转换应用于e,或者e是丢弃值表达式.
a是一个常量表达式,afor x和exabove的替换表明它保留了另一半的条件,所以它不是经常使用的.
| 归档时间: |
|
| 查看次数: |
110 次 |
| 最近记录: |