以下代码在我的计算机上工作,但是否保证按 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));
}

最佳答案



这部分是真的。



这部分不是真的。您可以对移出的对象执行以下操作:任何没有前提条件的操作。例如, clear() 对字符串没有先决条件,所以你可以 clear() 一个 move 的字符串。此时,您处于特定状态。同样,erase() 也没有先决条件。
operator>> 是另一个没有先决条件的操作(实际上,它被指定调用 erase() )。所以这段代码:

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

其实还好。

关于c++ - 使用已移出的对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41853748/

10-12 20:52