草庐IT

copy_ctor_assign

全部标签

c++ - 即使 move-assignment 是 noexcept,std::move_if_noexcept 也会调用 copy-assignment;为什么?

我试图尽可能接近强异常保证,但是在玩弄std::move_if_noexcept时,我遇到了一些看似奇怪的行为。尽管下面的类中的移动赋值操作符被标记为noexcept,复制赋值操作符在被调用时被调用带有相关函数的返回值。structA{A(){/*...*/}A(Aconst&){/*...*/}A&operator=(Aconst&)noexcept{log("copy-assign");return*this;}A&operator=(A&&)noexcept{log("move-assign");return*this;}staticvoidlog(charconst*msg){

c++ - 即使 move-assignment 是 noexcept,std::move_if_noexcept 也会调用 copy-assignment;为什么?

我试图尽可能接近强异常保证,但是在玩弄std::move_if_noexcept时,我遇到了一些看似奇怪的行为。尽管下面的类中的移动赋值操作符被标记为noexcept,复制赋值操作符在被调用时被调用带有相关函数的返回值。structA{A(){/*...*/}A(Aconst&){/*...*/}A&operator=(Aconst&)noexcept{log("copy-assign");return*this;}A&operator=(A&&)noexcept{log("move-assign");return*this;}staticvoidlog(charconst*msg){

c++ - 重载运算符 [] 并没有得到 "lvalue required as left operand of assignment"错误

这与所有“需要左值作为赋值的左操作数”错误问题有点相反。我有一个重载运算符[]的类,但只有返回临时的版本。如果要返回一个int:structFoo{intoperator[](intidx)const{returnint(0);}};Foof;f[1]=5;我会理所当然地得到左值编译器错误。但是,如果它返回一个结构类型,编译器(在这种情况下是GCC7.2)根本不会提示:structBar{};structFoo{Baroperator[](intidx)const{returnBar();}};Foof;f[1]=Bar();如果Bar是临时的并且没有专门的运算符=,为什么不会以同样的

c++ - 重载运算符 [] 并没有得到 "lvalue required as left operand of assignment"错误

这与所有“需要左值作为赋值的左操作数”错误问题有点相反。我有一个重载运算符[]的类,但只有返回临时的版本。如果要返回一个int:structFoo{intoperator[](intidx)const{returnint(0);}};Foof;f[1]=5;我会理所当然地得到左值编译器错误。但是,如果它返回一个结构类型,编译器(在这种情况下是GCC7.2)根本不会提示:structBar{};structFoo{Baroperator[](intidx)const{returnBar();}};Foof;f[1]=Bar();如果Bar是临时的并且没有专门的运算符=,为什么不会以同样的

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

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

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

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

c++ - 带有抛出 ctor 的对象的单例 - 再次访问?

我可以使用C++11或C++14(甚至C++17)。假设我有一个单例对象classMyInstance{public:MyInstance(){throwstd::runtime_exception("somethingwentwrong");//Ctormightthrow}};MyInstance&getInstance(){staticMyInstanceobj;returnobj;}现在,我确保每个对getInstance的调用都包含在一个中try{auto&inst=getInstance();}catch(std::runtime_error&e){//dosomethin

c++ - 带有抛出 ctor 的对象的单例 - 再次访问?

我可以使用C++11或C++14(甚至C++17)。假设我有一个单例对象classMyInstance{public:MyInstance(){throwstd::runtime_exception("somethingwentwrong");//Ctormightthrow}};MyInstance&getInstance(){staticMyInstanceobj;returnobj;}现在,我确保每个对getInstance的调用都包含在一个中try{auto&inst=getInstance();}catch(std::runtime_error&e){//dosomethin

c++ - std::copy 如何与流迭代器一起工作

通常的STL构造是:vectorcol;copy(istream_iterator(cin),istream_iterator(),back_inserter(col));我们使用istream_iterator从std输入(cin)复制到vector。谁能解释这段代码是如何工作的?我的问题是我不太了解这部分:istream_iterator(cin),istream_iterator() 最佳答案 首先,请注意,在这种情况下,根本不需要使用std::copy。您可以直接从迭代器初始化vector:vectorcol((istrea

c++ - std::copy 如何与流迭代器一起工作

通常的STL构造是:vectorcol;copy(istream_iterator(cin),istream_iterator(),back_inserter(col));我们使用istream_iterator从std输入(cin)复制到vector。谁能解释这段代码是如何工作的?我的问题是我不太了解这部分:istream_iterator(cin),istream_iterator() 最佳答案 首先,请注意,在这种情况下,根本不需要使用std::copy。您可以直接从迭代器初始化vector:vectorcol((istrea