只要标准愿意引入这个特性,大小不相同不是障碍,加一个 covariant return thunk 即可
这种 thunk 在 C++98 的基类/子类指针的 covariance 情况下已经存在(多继承的情形)
class A {
public:
virtual ~A() = default;
};
class B {
public:
virtual B* clone() const = 0;
virtual ~B() = default;
};
class C : public A, public B {
public:
C* clone() const override { return new C(*this); }
};
在 gcc 的实现里,除了生成 C::clone() 本身以外,还要生成两个 thunk:
00000000004011e0 <covariant return thunk to C::clone() const>:
4011e0: 48 83 ec 08 sub $0x8,%rsp
4011e4: e8 c7 ff ff ff callq 4011b0 <C::clone() const>
4011e9: 48 85 c0 test %rax,%rax
4011ec: 48 8d 50 08 lea 0x8(%rax),%rdx
4011f0: 48 0f 45 c2 cmovne %rdx,%rax
4011f4: 48 83 c4 08 add $0x8,%rsp
4011f8: c3 retq
4011f9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
0000000000401200 <covariant return thunk to C::clone() const>:
401200: 48 83 ef 08 sub $0x8,%rdi
401204: eb da jmp 4011e0 <covariant return thunk to C::clone() const>
401206: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
40120d: 00 00 00
如果要在 covariance 支持更复杂的转换,在 thunk 里生成不同的代码就是了
【 在 here080 (hero080) 的大作中提到: 】
: 标 题: Re: 为啥virtual clone(),返回智能指针,不能covariance?
: 发信站: 水木社区 (Sat May 8 16:24:22 2021), 站内
:
: 无法支持,隐形转换不保证大小相同啊。
:
: 如果要支持,估计得新加入covariance转换的概念了。
: 【 在 vonNeumann 的大作中提到: 】
: : unique_ptr 毕竟是库实现的,如果要支持,怕是得对所有可以隐式转换的类型都支持才行。。如果单独给 unique_ptr/shared_ptr 开口子那太难看。。
: :
:
: --
:
: ※ 来源:·水木社区
http://www.newsmth.net·[FROM: 76.126.252.*]
--
FROM 113.66.217.*