草庐IT

working-copy

全部标签

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++ - 实践中的 union 、别名和类型双关语 : what works and what does not?

我无法理解使用带有GCC的union可以做什么和不可以做什么。我阅读了有关它的问题(特别是here和here),但它们关注的是C++标准,我觉得C++标准和实践(常用的编译器)之间存在不匹配。特别是,我最近在GCConlinedoc中发现了令人困惑的信息。在阅读编译标志-fstrict-aliasing时。它说:-fstrict-aliasingAllowthecompilertoassumethestrictestaliasingrulesapplicabletothelanguagebeingcompiled.ForC(andC++),thisactivatesoptimizati

c++ - 实践中的 union 、别名和类型双关语 : what works and what does not?

我无法理解使用带有GCC的union可以做什么和不可以做什么。我阅读了有关它的问题(特别是here和here),但它们关注的是C++标准,我觉得C++标准和实践(常用的编译器)之间存在不匹配。特别是,我最近在GCConlinedoc中发现了令人困惑的信息。在阅读编译标志-fstrict-aliasing时。它说:-fstrict-aliasingAllowthecompilertoassumethestrictestaliasingrulesapplicabletothelanguagebeingcompiled.ForC(andC++),thisactivatesoptimizati

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++ - 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

c++ - va_copy -- 移植到 Visual C++?

Apreviousquestion展示了一种打印到字符串的好方法。答案涉及va_copy:std::stringformat(constchar*fmt,...);{va_listap;va_start(ap,fmt);std::stringbuf=vformat(fmt,ap);va_end(ap);returnbuf;}std::stringvformat(constchar*fmt,va_listap){//Allocateabufferonthestackthat'sbigenoughforusalmost//allthetime.size_tsize=1024;charbuf

c++ - va_copy -- 移植到 Visual C++?

Apreviousquestion展示了一种打印到字符串的好方法。答案涉及va_copy:std::stringformat(constchar*fmt,...);{va_listap;va_start(ap,fmt);std::stringbuf=vformat(fmt,ap);va_end(ap);returnbuf;}std::stringvformat(constchar*fmt,va_listap){//Allocateabufferonthestackthat'sbigenoughforusalmost//allthetime.size_tsize=1024;charbuf