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
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
实际上,它似乎几乎没有改变什么,或者?