2013-07-06 44 views
5

Mã sau có gọi ra bất kỳ loại hành vi nào được xác định hoặc không xác định được không? Tôi chắc chắn về cách tương tác với các tài liệu tham khảo đang làm việc và Google của tôi/SO tìm kiếm đang mọc lên trống:Chỉ định đối số tham chiếu cho biến cục bộ

struct S { 
    int i; 
}; 

void Fn(S& s_arg) { 
    S s_fn{s_arg.i+1}; 
    s_arg = s_fn; 
} 

int main(int argc, char** argv) { 
    S s_main{15}; 
    Fn(s_main); 
    return 0; 
} 

tôi không chắc chắn nào trong hai sẽ xảy ra khi việc chuyển nhượng xảy ra trong Fn:

  1. bản sao phân công điều hành mặc định của s được gọi vào s_main (là mục tiêu của các s_arg tham khảo), sao chép dữ liệu từ các địa phương (để Fn) s_fn vào main 's địa phương s_main (thông qua s_arg tham khảo, làm cho mọi thứ đúng đắn và chúng ta sẽ được xác định.
  2. Bản thân tham chiếu được chỉ định và bây giờ đề cập đến địa chỉ s_fn địa phương của Fn. Fn hiện đang trả về tham chiếu đến dữ liệu cục bộ và chương trình hiện đang chờ một hàm khác được gọi từ main, ghi đè s_fn cục bộ và gây tình trạng lộn xộn chung.

Trả lời

3

Không có UB ở đây, điểm tham chiếu đến s_main và bạn đang gán giá trị s_fn cho s_arg (trỏ đến s_main) và tất cả đều tốt. Hãy nhớ rằng các tham chiếu (không giống như con trỏ) khi được khởi tạo không thể trỏ đến một vùng khác trong bộ nhớ có nghĩa là trường hợp thứ hai bạn đã đề cập không thể xảy ra.

+0

Ah, đó là những gì tôi nhận được để xử lý tài liệu tham khảo dưới dạng con trỏ được tôn vinh mà tôi cho là. Tôi đoán rằng lý do họ không thể trỏ đến một khu vực khác trong bộ nhớ là bởi vì như trường hợp này, bất kỳ chuyển nhượng nào của tham chiếu luôn luôn gọi toán tử gán của đối tượng được nhắc đến? – user2555367

+0

@ user2555367: Tốt hơn là hãy nghĩ đến các tham chiếu dưới dạng bí danh (tên khác) thay vì con trỏ. –

2

Tham chiếu C++ không thể được "xếp lại" hoặc được tạo để tham chiếu đến một đối tượng khác so với ban đầu. Điều này loại trừ khả năng của bạn # 2. Mã là OK.

3

Tham chiếu (không giống như con trỏ) không thể thay đổi "địa chỉ" của chúng. Do đó, toán tử gán được gọi.

Các vấn đề liên quan