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