使用已从

时间:2017-01-25 14:10:07

标签: c++ c++11 move-semantics

以下代码适用于我的计算机,但这是否可以保证符合C ++标准?

void do_stuff(std::string);
std::string s;

while(std::cin >> s){
    do_stuff(std::move(s));
}

根据我对标准的理解,从移动的对象将保持有效但未指定的状态,并且仅值得破坏。因此,代码不能保证有效。

作为扩展,鉴于Notification类的知识以及get_notification覆盖成员details的事实,以下内容是否有效?

struct Notification{
    string details;
};

string get_string();
void do_more_stuff(Notification);
void get_notification(Notification& n){
    n.details = get_string();
}

Notification n;

while(get_notification(n)){
    do_more_stuff(std::move(n));
}

1 个答案:

答案 0 :(得分:4)

  

根据我对标准的理解,移动的对象保持有效但未指定的状态,

这部分是真的。

  

并且只值得破坏

这部分不是真的。 您可以对移动的对象执行的操作:任何没有前提条件的操作。例如,clear()对字符串没有先决条件,因此您可以clear()移动一个字符串。此时,您处于指定状态。同样,erase()没有先决条件。

operator>>是另一个没有先决条件的操作(事实上,它被指定为调用erase())。所以这段代码:

while(std::cin >> s){
    do_stuff(std::move(s));
}

实际上很好。