Tôi tin rằng biểu thức T()
sẽ tạo một giá trị (theo Chuẩn). Tuy nhiên, đoạn mã sau biên dịch (ít nhất là trên gcc4.0):Tại sao T() = T() được phép?
class T {};
int main()
{
T() = T();
}
Tôi biết kỹ thuật này có thể vì hàm thành viên có thể được gọi vào là tạm thời và trên chỉ là cách gọi các nhà điều hành = trên rvalue tạm được tạo ra từ số T()
đầu tiên.
Nhưng khái niệm này giống như gán giá trị mới cho giá trị. Có lý do chính đáng nào tại sao điều này được cho phép không?
Chỉnh sửa: Lý do tôi thấy điều này lạ là bị nghiêm cấm đối với các loại được cài sẵn nhưng được cho phép trên các loại do người dùng xác định. Ví dụ: int(2) = int(3)
sẽ không biên dịch vì đó là "giá trị không hợp lệ trong chuyển nhượng".
Vì vậy, tôi đoán câu hỏi thực sự là, hành vi này có phần không nhất quán được xây dựng trong ngôn ngữ vì một lý do nào đó không? Hoặc là nó có cho một số lý do lịch sử? (Ví dụ, nó sẽ là khái niệm âm thanh hơn để chỉ cho phép các hàm thành viên const được gọi trên biểu thức rvalue, nhưng điều đó không thể được thực hiện bởi vì có thể phá vỡ một số mã hiện có.)
Điều này cùng với câu trả lời của FredOverflow trả lời câu hỏi của tôi hoàn toàn. Cảm ơn! – Rimo