Tad*_*owo 5 c++ vector copy-constructor move-constructor c++11
阅读本文和本标准以及标准的23.3.6.5/1,其中最新的C++标准草案规定,当重新分配其元素时,实现者应优先使用非投掷移动构造函数T(T &&t) noexcept而不是const复制构造函数T(const T &t).手术std::vector<T>的结果push_back?关于引用绑定的重载决议是13.3.3.1.4/1吗?
编辑1
我在13.3.3.1.4/1上争论,原因如下:
重载决策选择要在语言中的七个不同上下文中调用的函数.[...] 调用构造函数以进行类对象的直接初始化(8.5)(13.3.1.3) ; [...]这些上下文中的每一个都以其自己独特的方式定义候选函数集和参数列表.但是,一旦确定了候选函数和参数列表,最佳函数的选择在所有情况下都是相同的:首先,候选函数的子集(具有适当数量的参数并满足某些其他条件的函数)是选择形成一组可行的功能(13.3.2).然后,基于将每个参数与每个可行函数的相应参数匹配所需的隐式转换序列(13.3.3.1)来选择最佳可行函数.
从为给定上下文(13.3.1)构造的候选函数集合中,选择一组可行函数,通过比较最佳拟合的参数转换序列(13.3.3),从中选择最佳函数.可行函数的选择考虑了除转换序列的排名之外的参数和函数参数之间的关系.
当类类型的对象被直接初始化(8.5),或从相同或派生类类型(8.5)的表达式进行复制初始化时,重载决策选择构造函数.
对于参数类型为参考的情况,请参见13.3.3.1.4.
当引用类型的参数直接(8.5.3)绑定到参数表达式时,隐式转换序列是标识转换,[...]
因此,我的结论是身份的转换结果在需要的优先顺序的要求T(T &&t) noexcept了T(const T &t).但是,我所争辩的另一方并不相信.所以,我在这里问.
编辑2
以下是23.3.6.5和13.3.3.1.4之间的联系:
首先,23.3.6.5要求以下内容std::vector:
[...]
void push_back(const T& x);void push_back(T&& x);备注:[...]如果一个异常被抛出比其他的拷贝构造函数,构造运动,赋值运算符,或移动的T赋值运算符或任何InputIterator的操作有没有影响.[...]
这由23.3.6.1/2涵盖,需要以下内容:
甲矢量满足所有的容器和可逆容器(在23.2在两个表中给出),[...]的要求
也就是说,std::vector预计符合23.2.1/7,其中规定了以下内容:
除非另有说明,否则本节中定义的所有容器都使用分配器获取内存(见17.6.3.5).
并使用23.2.1/3指定以下内容:
对于受本声明声明的子条款影响的
allocator_type组件,应使用该allocator_traits<allocator_type>::construct函数构造存储在这些组件中的对象,并使用allocator_traits <allocator_type> :: destroy函数(20.7.8.2)进行销毁.这些函数仅针对容器的元素类型调用,而不是针对容器使用的内部类型调用.
由于20.7.8.2只指定了一个construct函数,如下所示:
template <class T, class... Args>
static void construct(Alloc& a, T* p, Args&&... args);
Run Code Online (Sandbox Code Playgroud)
与20.7.8.2/5要求如下:
效果:
a.construct(p, std::forward<Args>(args)...)如果该调用格式正确,则调用; 否则,调用::new (static_cast<void*>(p)) T(std::forward<Args>(args)...).
和20.7.9.2/12需要以下默认分配器:
功效:
::new((void *)p) U(std::forward<Args>(args)...)
,无论是T(std::forward<Args>(args)...)在20.7.8.2/5,并U(std::forward<Args>(args)...)在20.7.9.2/12将遵循在构造函数重载决议要求13.3.3.1.4/1.
因此,标准要求实现者在由于操作而重新分配其元素时优先使用move-constructor而T(T &&t) noexcept不是copy-constructor .T(const T &t)std::vector<T>push_back
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |