首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么抛出局部变量调用moves构造函数?

为什么抛出局部变量调用moves构造函数?
EN

Stack Overflow用户
提问于 2013-06-05 19:39:51
回答 1查看 757关注 0票数 19

最近,我“玩弄”了rvalue,以了解它们的行为。大多数结果并没有让我感到惊讶,但后来我发现,如果我抛出一个局部变量,就会调用move构造函数。

在此之前,我认为移动语义规则的目的是保证只有当编译器检测到不再使用该对象(如在临时对象中),或者用户承诺不再使用它(如std:: move )时,该对象才会移动(并变为无效)。

然而,在下面的代码中,所有这些条件都不成立,我的变量仍然在移动(至少在g++ 4.7.3上)。

为什么会这样呢?

代码语言:javascript
复制
#include <iostream>
#include <string>
using namespace std;

int main() {
    string s="blabla";
    try {
        throw s;
    }
    catch(...) {
        cout<<"Exception!\n";
    }
    cout<<s; //prints nothing
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-05 19:50:11

在给定的情况下,这可能是一个编译器错误,因为抛出(和移出)的变量随后会被引用。

在一般情况下,在throw上调用move在概念上与在return上调用move是相同的。当已知变量不能在给定点(throwreturn)之后被引用时,最好自动调用move。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16938951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档