Gần đây, tôi đã "chơi" với các giá trị để hiểu hành vi của họ. Hầu hết các kết quả không surprize tôi, nhưng sau đó tôi thấy rằng nếu tôi ném một biến địa phương, các nhà xây dựng di chuyển được gọi. Cho đến lúc đó, tôi nghĩ rằng mục đích của các quy tắc ngữ nghĩa di chuyển là đảm bảo rằng đối tượng sẽ di chuyển (và trở thành không hợp lệ) chỉ khi trình biên dịch có thể phát hiện ra nó sẽ không được sử dụng nữa (như trong các đối tượng tạm thời), hoặc người dùng hứa sẽ không sử dụng nó (như trong std :: move).Tại sao việc ném biến cục bộ lại di chuyển hàm tạo?
Tuy nhiên, trong đoạn mã sau, không có điều kiện nào được giữ và biến của tôi vẫn đang được di chuyển (ít nhất là trên g ++ 4.7.3).
Tại sao lại như vậy? tiêu chuẩn
#include <iostream>
#include <string>
using namespace std;
int main() {
string s="blabla";
try {
throw s;
}
catch(...) {
cout<<"Exception!\n";
}
cout<<s; //prints nothing
}
nếu có, trông giống như lỗi trong gcc. –
@kbok: Bạn nói đúng, tôi đã xóa câu trả lời của mình (vì vậy tôi trả lời nhận xét của bạn ở đây).Tôi bằng cách nào đó nghĩ rằng 's' được tuyên bố trong khối' try', nên đã đọc kỹ câu hỏi một cách cẩn thận hơn. Xin lỗi tất cả –
Vui lòng báo cáo cho http://gcc.gnu.org/bugzilla - cảm ơn! –