2011-07-03 53 views
6

Tôi đang phát xung quanh với các tham chiếu trong C++ và lưu ý một chút hành vi kỳ lạ mà tôi không thể giải thích. Sự hiểu biết của tôi là nếu tôi có biến không phải const và tham chiếu const đến cùng biến đó và sau đó sửa đổi biến không phải const, tham chiếu phải phản ánh sửa đổi đó.thay đổi tham chiếu của const std :: tham chiếu chuỗi

Ví dụ:

void foo() { 
    int x = 5; 
    const int& y = x; 
    x = 10; 
    std::cout << "x = " << x << std::endl; 
    std::cout << "y = " << y << std::endl; 
} 

xuất ra như sau cho tôi:

x = 10 
y = 10 

Tuy nhiên, nếu tôi thay đổi kiểu để std :: string, tham chiếu const dường như không phản ánh biến được sửa đổi:

void foo() { 
    std::string x = "abc"; 
    const std::string& y = x; 
    x = "xyz"; 
    std::cout << "x = " << x << std::endl; 
    std::cout << "y = " << y << std::endl; 
} 

sản xuất như sau cho tôi:

x = xyz 
y = abc 

Đây có phải là hành vi mong đợi bình thường khi thực hiện điều này với chuỗi std :: không? (Tôi đang sử dụng GCC 4.6.0; Tôi không có bất kỳ trình biên dịch nào khác có sẵn tại thời điểm này, vì vậy tôi không biết nếu điều này chỉ xảy ra với phiên bản cụ thể này hay không.)

+0

Đó là mã biên dịch với * g ++ - mp-4.6 (GCC) 4.6.0 20.100.814 * in 'xyz' hai lần, tôi đã cố gắng trong mức tối ưu hóa khác nhau . Bạn đã sao chép * mã chính xác chưa? –

+0

Hoạt động như mong đợi đối với tôi. ("xyz \ nxyz \ n"). Điều này khiến tôi tin rằng có lỗi BCAK hoặc lỗi sao chép và dán. Vui lòng kiểm tra mã của bạn và đăng phiên bản đầy đủ của mã (** sử dụng sao chép và dán **). –

+0

Cảm ơn tất cả mọi người vì thông tin. Tôi đã làm cho nó hoạt động theo cách tôi mong đợi bằng cách sao chép-dán vào một tập tin khác. Khi tôi xem bản gốc ở chế độ nhị phân, đã có rất nhiều byte không liên quan ẩn trước dấu "&" trong tuyên bố của tôi mà tôi chỉ có thể đoán được bằng cách nào đó gây ra rắc rối. Tôi không biết làm thế nào nó thậm chí biên dịch như thế. Nhưng cảm ơn tất cả mọi người đã giúp tôi với điều này. Tất cả các bạn đều tuyệt vời! – Bobby

Trả lời

10

Hoạt động hoàn toàn tốt đẹp và đúng như mong đợi đối với tôi with GCC 4.3.44.5.1 cũng như ngoại tuyến với MSVC 10. Bạn không hiển thị cho chúng tôi mã bạn thực thi, hoặc có lỗi trong 4.6.0 mà tôi không tin. Bạn có chắc chắn rằng bạn đang thực sự sử dụng tham chiếu chứ không phải chỉ một mã số const std::string trong mã thực của bạn?

+0

Phần duy nhất của mã tôi không hiển thị là tệp tiêu đề bao gồm, khai báo foo() trước main() và main(), đơn giản gọi là foo() và trả về 0 cho hệ thống. Tôi viết lại điều này trong một tập tin khác, và nó hoạt động theo cách tôi mong đợi bây giờ (tức là, y = xyz), vì vậy tôi đoán một cái gì đó chỉ là screwy trong mã ban đầu? – Bobby

+0

@ Bobby: Có thể có một số khác biệt không mong muốn mà bạn chưa nhận ra. Hãy thử thực hiện một khác biệt của hai tập tin và xem kết quả. –

1

Kiểm tra tệp nguồn bằng một số chương trình khác, có thể bạn đã vô tình lưu tệp đó mà không có & hoặc một số vấn đề về mã hóa. Thành thật mà nói, tôi nghi ngờ một lỗi về kích thước này sẽ tồn tại trong GCC. Trong thực tế, tôi nghi ngờ nếu hành vi này thậm chí sẽ có thể.

trình như mong đợi ở đây với cấu hình sau:

Using built-in specs. 
COLLECT_GCC=g++ 
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.5.2/lto-wrapper.exe 
Target: mingw32 
Configured with: ../gcc-4.5.2/configure --enable-languages=c,c++,ada,fortran,objc,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgomp --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-runtime-libs --disable-werror --build=mingw32 --prefix=/mingw 
Thread model: win32 
gcc version 4.5.2 (GCC) 
Các vấn đề liên quan