小编Voi*_*oid的帖子

链接.如何同时定义和定义符号?

$ 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)

那么,如何解释这个输出?

  1. 这是符号的多个定义(三个T) - 它可能是怎样的?为什么链接器生成这样的库违反ODR?什么目的?为什么他们都有相同(和奇怪)的地址(0000000000000000)?
  2. 同一个符号如何同时定义(T)和undefined(U)?

c++ linker

6
推荐指数
1
解决办法
644
查看次数

为什么我们需要第二个std :: forward专业化?

据我所知,这个解释如何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定义(带&&)

那么,为什么我们需要呢?如果删除它会破坏什么?

c++ perfect-forwarding c++11

5
推荐指数
1
解决办法
493
查看次数

C++,继承的拷贝ctors不起作用?

考虑以下代码:

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)

c++ c++11

3
推荐指数
1
解决办法
230
查看次数

标签 统计

c++ ×3

c++11 ×2

linker ×1

perfect-forwarding ×1