【发布时间】:2015-07-25 05:51:00
【问题描述】:
#if __cplusplus >= 201103L
template <class _Key, class _Tp>
union __value_type
{
typedef _Key key_type;
typedef _Tp mapped_type;
typedef pair<const key_type, mapped_type> value_type;
typedef pair<key_type, mapped_type> __nc_value_type;
value_type __cc;
__nc_value_type __nc;
template <class ..._Args>
_LIBCPP_INLINE_VISIBILITY
__value_type(_Args&& ...__args)
: __cc(std::forward<_Args>(__args)...) {}
_LIBCPP_INLINE_VISIBILITY
__value_type(const __value_type& __v)
: __cc(__v.__cc) {}
_LIBCPP_INLINE_VISIBILITY
__value_type(__value_type& __v)
: __cc(__v.__cc) {}
_LIBCPP_INLINE_VISIBILITY
__value_type(__value_type&& __v)
: __nc(std::move(__v.__nc)) {}
_LIBCPP_INLINE_VISIBILITY
__value_type& operator=(const __value_type& __v)
{__nc = __v.__cc; return *this;}
_LIBCPP_INLINE_VISIBILITY
__value_type& operator=(__value_type&& __v)
{__nc = std::move(__v.__nc); return *this;}
_LIBCPP_INLINE_VISIBILITY
~__value_type() {__cc.~value_type();}
};
#else
// definition for C++03...
看起来目的是使__value_type 可分配和可移动,同时还能够将内容公开为pair<const key_type, mapped_type>(这是迭代器的值类型等)。但我不明白为什么它需要可分配或可移动,因为我看不出实现需要复制或移动地图内的节点的任何理由,或者实际上除了构造和销毁它们之外的任何事情-放置并重新配置指针。
【问题讨论】:
-
您是否尝试在文件中搜索
__nc的用途?请注意,无论哪种方式,此联合建议的用法都不符合要求。 -
@Potatoswatter 是的,它只用于实现显示的成员。
-
这可能是核心语言、库或两者都有缺陷。通常,该库应该可以使用该语言实现。您要报告问题吗?
-
@Potatoswatter 实现允许使用“魔法”
-
@MattMcNabb 标准库的神奇部分大部分都保留在 §18 中。委员会的意图是普通类型的数据结构不需要魔法。同样,libc++ 是与 Clang 不同的项目,许多其他标准库至少在某种程度上是可移植的。
标签: c++ c++11 dictionary stl libc++