【发布时间】:2014-05-24 04:47:04
【问题描述】:
在 C++ 中,它是使用std::enable_shared_from_this 和继承的小示例代码。这段代码中的p,调用了成员函数fb和fa。 p 是同一个对象,但被称为 fa 和 fb 的 this 地址不同。
为什么要使用不同的地址?
代码:
#include <memory>
#include <iostream>
template<class T> using S = std::enable_shared_from_this<T>;
struct A: S<A> { auto fa() const -> void { std::cerr << this << "\n";} };
struct B: S<B>, A { auto fb() const -> void { std::cerr << this << "\n";} };
auto main() -> int
{
auto p = std::make_shared<B>();
p -> fa();
p -> fb();
std::cerr << p << "\n";
}
结果:(在 Linux Mint 16 KDE 上测试的编译器是 clang++-3.2、g++-4.8 和 em++-1.12 以及作为在线编译平台的 wandbox 中的 clang++-3.4。)
0x8376a8
0x837698
0x837698
【问题讨论】:
-
这甚至不能用 libstdc++ 编译,从
enable_shared_from_this特化派生两次会导致模棱两可的调用。 -
恢复多重继承的顺序并重试。 Surprise!
标签: c++ memory-management c++11 std multiple-inheritance