提问者:小点点

有一个空的对基类的目的是什么?


libstdc++的pair实现有以下奇怪之处

template<typename, typename> class __pair_base
  {
    template<typename T, typename U> friend struct pair;
    __pair_base() = default;
    ~__pair_base() = default;
    __pair_base(const __pair_base&) = default;
    __pair_base& operator=(const __pair_base&) = delete;
  };

template<typename T, typename U>
  struct pair
  : private __pair_base<T, U>
{ /* never uses __pair_base */ };

null

null

null


共2个答案

匿名用户

null

null

我尽力重现历史,但我不是作者之一。

null

template<typename T, typename U>
struct pair
{
    T first;
    U second;
};

null

null

null

null

template<typename T> struct B;
template<typename T> struct A
{
    A(A&&) = default;
    A(const B<T> &);
};

template<typename T> struct B
{
    pair<A<T>, int> a;
    B(B&&) = default;
};

null

null

struct nonesuch
{
    nonesuch() = delete;
    ~nonesuch() = delete;
    nonesuch(nonesuch const&) = delete;
    void operator=(nonesuch const&) = delete;
};

// ...
pair& operator=(
    conditional_t<conjunction_v<is_copy_assignable<T>,
                                is_copy_assignable<U>>,
                  const pair&, const nonesuch&>::type)

null

null

pair<int, int> p = {};  // succeeds
p = {};  // fails

您仍然可以用大括号初始化它。由于delete不解析重载解析,这是一个硬故障。

null

struct no_braces_nonesuch : nonesuch
{
    explicit no_braces_nonesuch(const no_braces_nonesuch&) = delete;
};

null

null

struct anything
{
    template<typename T>
    operator T() { return {}; }
};

anything a;
pair<int, int> p;
p = a;

null

class __pair_base
  {
    template<typename T, typename U> friend struct pair;
    __pair_base() = default;
    ~__pair_base() = default;
    __pair_base(const __pair_base&) = default;
    __pair_base& operator=(const __pair_base&) = delete;
  };

null

null

null

pair<pair<int, int>, int> p;

不幸的是,空基优化仅适用于基类子对象与相同类型的其他子对象不重叠的情况。在这种情况下,内部对的__pair_base与外部对的重叠。

null

null

template<pair<int, int>>
struct S;  // fails

null

匿名用户

null

null

null

实际上,它似乎几乎没有改变什么,或者?