以下代码适用于我的计算机,但这是否可以保证符合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));
}
答案 0 :(得分:4)
根据我对标准的理解,移动的对象保持有效但未指定的状态,
这部分是真的。
并且只值得破坏
这部分不是真的。 是您可以对移动的对象执行的操作:任何没有前提条件的操作。例如,clear()
对字符串没有先决条件,因此您可以clear()
移动一个字符串。此时,您处于指定状态。同样,erase()
没有先决条件。
operator>>
是另一个没有先决条件的操作(事实上,它被指定为调用erase()
)。所以这段代码:
while(std::cin >> s){
do_stuff(std::move(s));
}
实际上很好。