复制空对象是否涉及对该对象的访问?
问题解答:
struct E {}; E e; E f(e); 是否访问了e? 直接给结论:这段代码并没有访问e,具体分析如下:
1. 空类的隐式拷贝构造函数行为
因为E是空类,编译器会自动为它生成一个隐式的拷贝构造函数,签名大致为:
E(const E& other) noexcept;
根据C++标准的规定,隐式定义的拷贝构造函数仅会对类的基类和非静态数据成员执行逐成员拷贝操作。而E既没有基类,也没有任何非静态数据成员,所以这个隐式拷贝构造函数的函数体实际上是空的——它不需要做任何拷贝动作。
2. "访问"的定义边界
你提到“访问”指读取或修改对象的值,这里需要明确:将e绑定到拷贝构造函数的引用参数上,并不属于“读取对象的值”。绑定引用只是建立了一个对象的别名,并没有触及对象的任何存储内容(何况空类本身也没有可存储的内容)。
结合你给出的标准片段进一步验证:
非联合类X的隐式定义拷贝/移动构造函数会对其基类和成员进行逐成员拷贝/移动。[...]初始化顺序与用户定义构造函数中基类和成员的初始化顺序相同。设x为构造函数的参数,或对于移动构造函数,为指向该参数的xvalue。每个基类或非静态数据成员会以与其类型适配的方式进行拷贝/移动:[...]基类或成员会直接用x的对应基类或成员进行初始化。
由于E没有基类和成员,整个拷贝初始化过程中,没有任何步骤需要读取x(也就是e)的对应基类或成员——因为这些元素根本不存在。所以整个过程没有对e的值进行读取或修改,也就没有发生“访问”。
内容的提问来源于stack exchange,提问作者Passer By
相关产品推荐
相关产品推荐

