Nếu bạn biên dịch chương trình này bằng trình biên dịch C++ 11, vectơ không được di chuyển ra khỏi hàm.Kết quả của toán tử bậc ba không phải là rvalue
#include <vector>
using namespace std;
vector<int> create(bool cond) {
vector<int> a(1);
vector<int> b(2);
return cond ? a : b;
}
int main() {
vector<int> v = create(true);
return 0;
}
Nếu bạn trả lại bản sao như thế này, nó sẽ được di chuyển.
if(cond) return a;
else return b;
Đây là demo on ideone.
Tôi đã thử với gcc 4.7.0 và MSVC10. Cả hai đều hành xử theo cùng một cách.
Tôi đoán tại sao điều này xảy ra là:
Loại toán tử bậc ba là một giá trị vì nó được đánh giá trước khi câu lệnh trả về được thực thi. Tại thời điểm này a và b chưa phải là xvalues (sắp hết hạn).
Giải thích này có đúng không?
Đây có phải là lỗi trong tiêu chuẩn không?
Đây rõ ràng không phải là hành vi dự định và trường hợp rất phổ biến theo ý kiến của tôi.
"Nếu toán hạng thứ hai và thứ ba là giá trị của cùng một danh mục giá trị và có cùng loại, kết quả là loại danh mục và giá trị đó [...]" §5.16/4 – Mat
Ví dụ không liên quan đến giá trị hoặc xvalues. Nhưng đó là một câu hỏi thú vị tại sao một bản sao được thực hiện thay vì di chuyển. – aschepler