一位同事向我展示了这个程序:
#include <iostream>
#include <memory>
struct A {
std::shared_ptr<int> u{ new int };
};
struct B : virtual A {};
struct C : virtual A {};
struct D : B, C {};
int main() {
D d;
d = D( d );
std::cout << d.u;
}
尽管初始化shared_ptr
为new int
打印零。在线演示:https ://gcc.godbolt.org/z/n3Kxbc3Pf
我发现它有某种与菱形继承和公共虚拟基类相关的东西。
该程序是否存在任何未定义的行为,或者该程序格式正确并且标准要求在此处打印零?
d = D( d )
调用D
的隐式定义的移动赋值运算符(以的临时副本d
作为赋值源)。[class.copy.assign]/12:复制代码
在这种情况下,如果基数的分配
A
执行多次:std::shared_ptr<int>
处于移动状态,即空的状态。shared_ptr
为空的 分配给d.u
,使其也变为空,从而导致了观察到的结果。