Tôi đang thực hiện một số C++ quy tắc phân tích tĩnh, và một trong số họ cấm một hàm từ trả về một tham chiếu hoặc con trỏ đến một tham số tham chiếu của chức năng, tức là sau đều không tuân thủ:Quy tắc phân tích tĩnh C++ này có ý nghĩa như thế nào không?
int *f(int& x) { return &x; } // #1
const int *g(const int& x) { return &x; } // #2
int& h(int& x) { return x; } // #3
const int& m(const int& x) { return x; } // #4
Các biện minh cho điều này là "Đó là hành vi được xác định thực hiện cho dù tham số tham chiếu là đối tượng tạm thời hay tham chiếu đến tham số."
Tôi đang bối rối bởi điều này, tuy nhiên, bởi vì các nhà khai thác luồng trong C++ được viết theo cách này, ví dụ:
std::ostream& operator<<(std::ostream& os, const X& x) {
//...
return os;
}
Tôi nghĩ rằng tôi khá tự tin rằng các nhà khai thác luồng trong C++ không thể hiện hành vi được xác định thực hiện, vậy điều gì đang diễn ra? Theo sự hiểu biết của tôi như hiện tại, tôi mong đợi # 1 và # 3 được xác định rõ ràng, trên cơ sở đó thời gian không thể bị ràng buộc với các tham chiếu không const, do đó, int& x
đề cập đến một đối tượng thực sự có tuổi thọ vượt quá phạm vi của hàm, do đó trả về một con trỏ hoặc tham chiếu đến đối tượng đó là tốt. Tôi mong đợi # 2 là tinh ranh, bởi vì một tạm thời có thể đã bị ràng buộc để const int& x
, trong trường hợp đó cố gắng để có địa chỉ của nó sẽ có vẻ là một kế hoạch xấu. Tôi không chắc chắn về # 4 - cảm giác ruột của tôi là điều đó cũng có khả năng tinh ranh, nhưng tôi không chắc chắn. Cụ thể, tôi không rõ ràng về những gì sẽ xảy ra trong trường hợp sau:
const int& m(const int& x) { return x; }
//...
const int& r = m(23);
Bạn đang sử dụng MSVC++? – Nawaz
@Nawaz: Tôi đang sử dụng .QL để viết các truy vấn trên các cơ sở mã lớn :) Tôi không nghĩ nó quan trọng đối với trình biên dịch nào, tôi lý tưởng tìm kiếm một câu trả lời độc lập cho nền tảng. –
Tại sao tôi hỏi vì MSVC++ cung cấp phần mở rộng trình biên dịch cho phép các thời gian liên kết với các tham chiếu không phải const. Và nếu bạn đang sử dụng công cụ phân tích tĩnh của Microsoft, thì nó cũng có thể xem xét phần mở rộng này. – Nawaz