$ nm --demangle /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/libsupc++.a | grep "__cxxabiv1::__class_type_info::~__class_type_info"
Run Code Online (Sandbox Code Playgroud)
给出以下输出:
0000000000000000 T __cxxabiv1::__class_type_info::~__class_type_info()
0000000000000000 T __cxxabiv1::__class_type_info::~__class_type_info()
0000000000000000 T __cxxabiv1::__class_type_info::~__class_type_info()
U __cxxabiv1::__class_type_info::~__class_type_info()
U __cxxabiv1::__class_type_info::~__class_type_info()
Run Code Online (Sandbox Code Playgroud)
那么,如何解释这个输出?
T) - 它可能是怎样的?为什么链接器生成这样的库违反ODR?什么目的?为什么他们都有相同(和奇怪)的地址(0000000000000000)?T)和undefined(U)?据我所知,这个解释如何std::forward工作http://thbecker.net/articles/rvalue_references/section_08.html我们只能省去一个版本std::forward:
template<class S>
S&& forward(typename remove_reference<S>::type& a) noexcept
Run Code Online (Sandbox Code Playgroud)
但实际上,我们有(http://en.cppreference.com/w/cpp/utility/forward)第二版:
template< class T >
T&& forward( typename std::remove_reference<T>::type&& t );
Run Code Online (Sandbox Code Playgroud)
这与前一个不同之处仅在于如何t定义(带&&)
那么,为什么我们需要呢?如果删除它会破坏什么?
考虑以下代码:
class TBase {
public:
TBase();
TBase(const TBase &);
};
class TDerived: public TBase {
public:
using TBase::TBase;
};
void f() {
TBase Base;
TDerived Derived(Base); // <=== ERROR
}
Run Code Online (Sandbox Code Playgroud)
所以,我有基类和派生类,并希望使用"使用TBase :: TBase"从基类拉复制ctor,以便能够以这种方式创建派生类的实例:
TDerived Derived(Base);
Run Code Online (Sandbox Code Playgroud)
但是所有编译器都拒绝这些错误消息
7 : note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'TBase' to 'const TDerived' for 1st argument
Run Code Online (Sandbox Code Playgroud)
为什么?我究竟做错了什么?为什么"使用TBase :: TBase"在这种情况下不起作用?
更新 如何从cppreference.com解释以下代码?
struct B1 {
B1(int);
};
struct D1 : B1 {
using B1::B1;
// …Run Code Online (Sandbox Code Playgroud)