草庐IT

c++ - 为什么 STL 容器中的交换成员函数没有声明为 noexcept?

截至N3797C++标准要求容器的swap函数不抛出任何异常,除非另有说明[container.requirements.general](23.2.1§10)。为什么swap成员函数被指定不抛出未声明的noexcept?同样的问题也适用于专门的非成员swap重载。 最佳答案 进一步到whatrefpsaid,这是DanielKrügler在std-discussion邮件列表上的帖子:Theinternalpolicytodeclareafunctionasunconditionalnoexceptisexplainedinhtt

c++ - 从复制构造函数调用默认赋值运算符是不好的形式吗?

考虑一个需要复制的类。拷贝中的绝大多数数据元素必须严格反射(reflect)原始数据,但是只有少数元素的状态不需要保留,需要重新初始化。从复制构造函数调用默认赋值运算符是不是不好的形式?默认的赋值运算符可以很好地处理普通旧数据(int、double、char、short)以及用户定义的每个赋值运算符的类。指针需要单独处理。一个缺点是,由于没有执行额外的重新初始化,这种方法会使赋值运算符失效。也不可能禁用赋值运算符,因此打开了用户使用不完整的默认赋值运算符Aobj1,obj2;创建损坏类的选项;对象2=对象1;/*结果可能是一个错误初始化的obj2*/.最好放宽对a(orig.a),b(

c++ - 从复制构造函数调用默认赋值运算符是不好的形式吗?

考虑一个需要复制的类。拷贝中的绝大多数数据元素必须严格反射(reflect)原始数据,但是只有少数元素的状态不需要保留,需要重新初始化。从复制构造函数调用默认赋值运算符是不是不好的形式?默认的赋值运算符可以很好地处理普通旧数据(int、double、char、short)以及用户定义的每个赋值运算符的类。指针需要单独处理。一个缺点是,由于没有执行额外的重新初始化,这种方法会使赋值运算符失效。也不可能禁用赋值运算符,因此打开了用户使用不完整的默认赋值运算符Aobj1,obj2;创建损坏类的选项;对象2=对象1;/*结果可能是一个错误初始化的obj2*/.最好放宽对a(orig.a),b(

c++ - "using std::swap"如何启用ADL?

在Whatisthecopy-and-swapidiom示例如下:friendvoidswap(dumb_array&first,dumb_array&second)//nothrow{//enableADL(notnecessaryinourcase,butgoodpractice)usingstd::swap;//byswappingthemembersoftwoclasses,//thetwoclassesareeffectivelyswappedswap(first.mSize,second.mSize);swap(first.mArray,second.mArray);}us

c++ - "using std::swap"如何启用ADL?

在Whatisthecopy-and-swapidiom示例如下:friendvoidswap(dumb_array&first,dumb_array&second)//nothrow{//enableADL(notnecessaryinourcase,butgoodpractice)usingstd::swap;//byswappingthemembersoftwoclasses,//thetwoclassesareeffectivelyswappedswap(first.mSize,second.mSize);swap(first.mArray,second.mArray);}us

C++:使用自定义分配器时的高效交换()

对我来说,这似乎是C++模板的月份......我有一个SecureString。SecureString看起来就像一个std::string,除了它使用一个自定义分配器,它在销毁时归零:classSecureString{public:typedefstd::basic_string,zallocator>SecureStringBase;typedefzallocator::size_typesize_type;staticconstsize_typenpos=static_cast(-1);....private:SecureStringBasem_base;};SecureStr

C++:使用自定义分配器时的高效交换()

对我来说,这似乎是C++模板的月份......我有一个SecureString。SecureString看起来就像一个std::string,除了它使用一个自定义分配器,它在销毁时归零:classSecureString{public:typedefstd::basic_string,zallocator>SecureStringBase;typedefzallocator::size_typesize_type;staticconstsize_typenpos=static_cast(-1);....private:SecureStringBasem_base;};SecureStr

c++ - swap() 会导致未定义的行为吗?

我试图从[C++11:utility.swap]中了解std::swap的条件。模板定义为templatevoidswap(T&,T&)(加上一些noexcept细节)并具有“交换存储在两个位置的值”的效果。以下程序是否定义明确?#includeintmain(){intm,n;std::swap(m,n);}如果我自己编写交换代码(即inttmp=m;m=n;n=tmp;),它将具有未定义的行为,因为它会尝试左值到右值的转换一个未初始化的对象。但是标准的std::swap函数似乎没有附加任何条件,也不能从规范中得出存在任何左值到右值和因此UB的规范。标准是否要求std::swap对未

c++ - swap() 会导致未定义的行为吗?

我试图从[C++11:utility.swap]中了解std::swap的条件。模板定义为templatevoidswap(T&,T&)(加上一些noexcept细节)并具有“交换存储在两个位置的值”的效果。以下程序是否定义明确?#includeintmain(){intm,n;std::swap(m,n);}如果我自己编写交换代码(即inttmp=m;m=n;n=tmp;),它将具有未定义的行为,因为它会尝试左值到右值的转换一个未初始化的对象。但是标准的std::swap函数似乎没有附加任何条件,也不能从规范中得出存在任何左值到右值和因此UB的规范。标准是否要求std::swap对未

c++ - 如何在具有 copy-and-swap 习语的赋值运算符中使用 noexcept?

移动赋值运算符通常应该声明为noexcept(即将类型存储在STL容器中)。但是copy-and-swap习惯用法允许在单个代码中定义复制和移动赋值运算符。在这种情况下如何处理noexcept说明符?复制构造可以抛出,但我怀疑它是否会违反noexcept说明符。//IsitcorrectconsideringthatTcopyconstructorcanthrow?T&operator=(Tother)noexcept; 最佳答案 由于拷贝是在调用的调用者的方面制作的,因此它不是您的函数所做的一部分。因此它不能由您的函数控制,因此您