草庐IT

c++ - 在 C++11 中抛出异常时是否使用 move 语义?

http://www.drdobbs.com/cpp/practical-c-error-handling-in-hybrid-env/197003350?pgno=4在这篇文章中,HerbSutter解释说,抛出异常需要一个异常的拷贝,因为它是作为临时创建的,因此使用std::auto_ptr来绕过复制开销。鉴于C++11中提供了move语义,这还有必要吗? 最佳答案 我刚刚检查过,标准允许省略将throw表达式的操作数指定的对象复制或move到异常对象中如果您不更改程序的含义(即如果您重新抛出并且随后的捕获会突然看到一个已更改的

c++ - 在 C++11 中抛出异常时是否使用 move 语义?

http://www.drdobbs.com/cpp/practical-c-error-handling-in-hybrid-env/197003350?pgno=4在这篇文章中,HerbSutter解释说,抛出异常需要一个异常的拷贝,因为它是作为临时创建的,因此使用std::auto_ptr来绕过复制开销。鉴于C++11中提供了move语义,这还有必要吗? 最佳答案 我刚刚检查过,标准允许省略将throw表达式的操作数指定的对象复制或move到异常对象中如果您不更改程序的含义(即如果您重新抛出并且随后的捕获会突然看到一个已更改的

c++ - 异常安全代码和移动语义

我想写容器类。这个容器有两个特化的插入方法——首先使用复制构造函数将数据从一个容器复制到另一个容器元素。如果复制构造函数抛出异常,我只是撤消对容器的所有更改,就像什么都没发生一样。第二个特化使用移动构造函数,这就是事情变得复杂的地方。当我逐个元素地将项目从一个容器移动到另一个容器时,移动构造函数可能会引发异常。如果发生这种情况-当某些元素被移动而其他元素留在原来的位置时,我的状态真的很困惑。如果我尝试将元素移回-我可能会遇到另一个异常。是否可以以异常安全的方式编写这样的东西,或者异常安全和移动语义是互斥的? 最佳答案 使用std::

c++ - 异常安全代码和移动语义

我想写容器类。这个容器有两个特化的插入方法——首先使用复制构造函数将数据从一个容器复制到另一个容器元素。如果复制构造函数抛出异常,我只是撤消对容器的所有更改,就像什么都没发生一样。第二个特化使用移动构造函数,这就是事情变得复杂的地方。当我逐个元素地将项目从一个容器移动到另一个容器时,移动构造函数可能会引发异常。如果发生这种情况-当某些元素被移动而其他元素留在原来的位置时,我的状态真的很困惑。如果我尝试将元素移回-我可能会遇到另一个异常。是否可以以异常安全的方式编写这样的东西,或者异常安全和移动语义是互斥的? 最佳答案 使用std::

c++ - 了解 move 语义与模板元编程的好处

我已经阅读了一些关于C++11中move语义的描述,我想知道它可以在什么上下文中使用。目前,许多C++数学库使用模板元编程来延迟计算。如果M=A+B+C*D,其中M、A、B、C和D是矩阵,则模板元编程允许避免无用的拷贝。move语义是一种更方便的方式来做这些事情吗?如果不是,在什么上下文中使用move语义。如果是,与模板元编程相比,这种用途有什么区别/限制? 最佳答案 我相信你所说的“模板元编程”更准确的术语是expressiontemplates.如果您的矩阵动态分配它们的数据,move语义可以帮助将数据从对象传输到对象(包括到/

c++ - 了解 move 语义与模板元编程的好处

我已经阅读了一些关于C++11中move语义的描述,我想知道它可以在什么上下文中使用。目前,许多C++数学库使用模板元编程来延迟计算。如果M=A+B+C*D,其中M、A、B、C和D是矩阵,则模板元编程允许避免无用的拷贝。move语义是一种更方便的方式来做这些事情吗?如果不是,在什么上下文中使用move语义。如果是,与模板元编程相比,这种用途有什么区别/限制? 最佳答案 我相信你所说的“模板元编程”更准确的术语是expressiontemplates.如果您的矩阵动态分配它们的数据,move语义可以帮助将数据从对象传输到对象(包括到/

c++ - 使用 4 个线程获取/释放语义

我目前正在阅读AnthonyWilliams的C++ConcurrencyinAction。他的一个list显示了这段代码,他声明了z!=0的断言。可以火。#include#include#includestd::atomicx,y;std::atomicz;voidwrite_x(){x.store(true,std::memory_order_release);}voidwrite_y(){y.store(true,std::memory_order_release);}voidread_x_then_y(){while(!x.load(std::memory_order_acqu

c++ - 使用 4 个线程获取/释放语义

我目前正在阅读AnthonyWilliams的C++ConcurrencyinAction。他的一个list显示了这段代码,他声明了z!=0的断言。可以火。#include#include#includestd::atomicx,y;std::atomicz;voidwrite_x(){x.store(true,std::memory_order_release);}voidwrite_y(){y.store(true,std::memory_order_release);}voidread_x_then_y(){while(!x.load(std::memory_order_acqu

c++ - 如何在函数返回期间将 move 语义与 std::string 一起使用?

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:C++11rvaluesandmovesemanticsconfusion我认为正确的是std::stringGetLine(){std::stringstr;std::getline(std::cin,str);returnstd::move(str);}但是在这个链接http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html(检查标题部分从函数返回显式右值引用)这是move语义排名第一的谷歌搜索结

c++ - 如何在函数返回期间将 move 语义与 std::string 一起使用?

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:C++11rvaluesandmovesemanticsconfusion我认为正确的是std::stringGetLine(){std::stringstr;std::getline(std::cin,str);returnstd::move(str);}但是在这个链接http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html(检查标题部分从函数返回显式右值引用)这是move语义排名第一的谷歌搜索结