为什么noexcept move构造函数在向量重新分配期间没有被调用
Why noexcept move constructor is not getting called during vector reallocation?
我们知道何时将新元素添加到std :: vector(通过push_back(,它可能缺乏它的空间元素,然后从现有块转移到新块。在C 98这是通过复制旧位置的元素然后破坏这些对象完成的,因此,它可以提供强大的异常保证,并且在C 11中可以优化它使用MOVE构造函数,只要不是Except,但是如果我的驱动器是Noexcept(false(会发生什么,为什么没有进行优化?
#include <iostream>
#include <vector>
class X
{
public:
X()
{
}
X(const X& ob) noexcept
{
std::cout<<"Copy Constructor...."<<std::endl;
}
X(X&& ob) noexcept
{
std::cout<<"Move Constructor...."<<std::endl;
}
~X() noexcept(false)
{
}
};
int main()
{
std::vector<X> myobs;
for(int i=0;i<1000;i++)
{
myobs.push_back(X());
}
return 0;
}
为什么在上面的方案中调用复制构造函数,也请注意,如果我将destructor作为noexcept(默认行为(,则只会调用移动构造函数。
增加我对强大的异常保证的理解(在vector :: push_back中(是旧内存中的元素都不被破坏,直到所有人都成功复制,这意味着最后调用了destuructors是noexcept
问题与is_nothrow_move_constructible<T>
的规范有关,目前指定了该表达式是否表达式
T(declval<T&&>())
是毫无疑问的,但这涉及(临时(的破坏者以及移动构造函数。可以说,这是一个正在进行的LWG 2116的库缺陷。GCC遵循规范是正确的。规格本身不好。
相关文章:
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- unique_ptr:在分配之前调用 reset 有什么效果
- 调用析构函数以释放动态分配的内存
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- C++析构函数调用两次,堆栈分配的复合对象
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 在之后仍需要使用源对象时调用父移动分配运算符
- 为什么调用移动分配?
- 从 C# 调用 C++ DLib 会导致错误的分配异常
- 如何为包含最多N个元素的std::multiset调用最大数量分配
- 通过外部分配的数据调用特征 GEMM
- C++ - 从移动分配运算符调用复制分配
- 为什么分配了 nullptr 的指针可以调用成员函数?
- 分配内存并在回调时调用C++的 Rust 函数崩溃
- 默认移动分配调用析构函数,复制分配不
- C++:自动向量重新分配调用复制构造函数?为什么
- 第二个字符串在多次重新分配调用后损坏
- Windows堆分配调用堆栈-奇怪的调用堆栈
- 是否有一个位集类在实例化时大小,但避免了 boost::d ynamic_bitset<> 的额外分配调用?