草庐IT

throw_move_assignable

全部标签

c++ - C++ 中的异常处理 : Throwing a double when using "throw(int)"

下面的程序总是输出“Error:double10.2”。我不明白为什么。根据我的说法,如果fun1()只允许抛出int,那么程序应该要么(1)崩溃(2)或者把double改成int然后throw。这意味着,输出应该是“Error:int10”。然而,情况并非如此。谁能解释一下??voidfun1()throw(int){cout 最佳答案 您的编译器不符合标准。根据标准,您的程序应以调用std::unexpected结束。在让double异常转义fun1之后。也就是说-不要使用异常规范。它们已被弃用且无用。

c++ - 使用已被 std::move 到别处的变量时出现错误,或至少出现警告

这个:voidfoo(int&&r){std::cout如果我在move变量后不小心使用了它,是否没有办法告诉编译器给我一个错误(或警告)?我认为这会很方便。很多时候我发现自己像那样将变量move到其他地方,但后来我手动必须非常小心,以免以后不使用它们。现在这还没有造成任何问题,但谁知道呢……最好注意安全!也许存在一些预处理器技巧(或相当广泛可用的编译器扩展)来执行此操作?更现实的例子:structHugeStorage{std::vectorm_vec;HugeStorage(std::vectorvec):m_vec(std::move(vec)){}};structSmallSt

c++ - 在 std::vector 上调整大小不调用 move 构造函数

这个问题在这里已经有了答案:C++11rvaluereferencecallingcopyconstructortoo(4个答案)关闭7年前。我一直在研究std::vector以了解对象何时被构造、析构、复制构造和move构造。为此,我编写了以下程序#include#includeclassTest{public:Test(){std::couta(1);a.resize(3);return0;}当调整a的大小时,会发生重新分配。我的猜测是对象a[0]被move构造到新的a[0]。但是,对于libc++和libstdc++,似乎调用了复制构造函数而不是move构造函数。这种行为有什么原

c++ - 为什么 std::make_move_iterator 适用于 vector<string> 但不适用于 vector<int>

我期待std::make_move_iterator总是会move内容,但似乎不会。看起来是在vector中move元素但不在vector.请看下面的代码片段:#include#include#include#includevoidmoveIntVector(){std::coutv1;for(unsignedi=0;iv2(std::make_move_iterator(v1.begin()+5),std::make_move_iterator(v1.end()));std::coutv1;for(unsignedi=0;iv2(std::make_move_iterator(v1.

c++ - 为什么 C++11 的 move 构造函数/赋值运算符不按预期运行

#includeusingnamespacestd;structA{A(){cout我的预期输出应该是:A()A(A&&)~A()~A()然而,实际输出是:(C++编译器是:VisualStudio2012)A()~A()~A()这是VC++的错误吗?还是我的误会? 最佳答案 根据thisblogpost,VC++2012目前实现N2844+DR1138,但不是N3053.因此,编译器不会为您隐式生成move构造函数或赋值运算符。如果您添加显式默认值并将构造函数move到B,那么您将获得您期望的输出。

c++ - 为什么在超出容量时 resize() 会导致 vector 内容的复制而不是 move ?

这个问题在这里已经有了答案:Howtoenforcemovesemanticswhenavectorgrows?(3个答案)关闭9年前。下面给定类X(明确定义的特殊成员函数与本实验无关):structX{X(){}X(int){}X(Xconst&){std::cout以下程序创建了一个类型为X的对象vector,并调整它的大小以超出其容量并强制重新分配:#include#includeintmain(){std::vectorv(5);v.resize(v.capacity()+1);}由于X类提供了move构造函数,我希望vector的先前内容在重新分配后被move到新存储中。令人

c++ - 这种在 C++03 中模拟 move 语义的方法有多安全?

使用thisanswer,我发明了自己的基于swap的C++03模拟move语义的方法。首先,我检测move语义(即C++03的可用性):#if__cplusplus>=201103L||defined(__GXX_EXPERIMENTAL_CXX0X__)||\defined(_MSC_VER)&&_MSC_VER>=1600#defineHAS_MOVE_SEMANTICS1#elifdefined(__clang)#if__has_feature(cxx_rvalue_references)#defineHAS_MOVE_SEMANTICS1#else#defineHAS_MOV

c++ - std::make_shared 与 throw dtor 和 libc++ 不编译

这是非常基本的代码:#includeclassfoo{public:~foo()noexcept(false){}};intmain(){autox=std::make_shared();return0;}编译如下:g++-std=c++11test.cpp当使用libc++编译时,它会失败:/usr/bin/../include/c++/v1/memory:3793:7:error:exceptionspecificationofoverridingfunctionismorelaxthanbaseversionclass__shared_ptr_emplace^/usr/bin/.

c++ - 为什么 vector 的 move ctor 不推导出 noexcept()?

为什么要为std::vectormove构造函数使用自定义分配器不会推断出noexcept()来自分配器的行为?这导致封装此类vector的类无法形成可以在某些中正常move的(其他)vector秒。即使基础类型满足必要的要求(MoveInsertable和DefaultInsertable)。 最佳答案 我假设“使用自定义分配器为std::vectormove构造函数”是指分配器扩展的move构造函数,即这个构造函数:vector(vector&&v,constallocator_type&a);主要原因是如果v.get_allo

move 操作后 C++ lambda ‘this’ 指针失效

我当前的项目中有以下(简化的)代码:#include#include#include#includeclassTest{public:Test()=default;Test(constTest&other)=delete;Test&operator=(constTest&other)=delete;Test(Test&&other)=default;Test&operator=(Test&&other)=default;voidsetFunction(){lambda=[this](){a=2;};}intcallAndReturn(){lambda();returna;}privat