簡體   English   中英

C ++中const * cast變量const_cast之后的地址

[英]address after const_cast of a *const* variable in C++

我知道以下內容應該是未定義的行為,因為原始變量是const。 但是,這兩個地址&x&rx怎么可能是相同的,但是它們打印的值(我不能說成立,因為它根本不能保持)不是。 謝謝!

const int x=10;
int& rx = const_cast<int&>(x);
rx++;
cout << x << " and " << rx << endl;
cout << "is &x == &xr: " << (&x==&rx) << endl;

G ++ 4.9的輸出是

10 and 11
is &x == &xr: 1

這顯然是一種不確定的行為,因此,據我所知,問題不應該是它為什么會發生,而應該是它是什么導致的。

我不知道GCC如何翻譯和優化代碼,但我最好的猜測是在cout行中, x被替換為編譯時假定為const值(編譯器假定為10 )。

看看產生的匯編代碼可能會很有趣!

不管它的合法性如何,編譯器(截至上周,是clang ++ 3.7.0)確實確實在優化了代碼的“意圖”:

    movl    $_ZSt4cout, %edi
    movl    $10, %esi
    callq   _ZNSolsEi
    movq    %rax, %rbx
    movl    $.L.str, %esi
    movl    $5, %edx
    movq    %rbx, %rdi
    callq   _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
    movl    $11, %esi
    movq    %rbx, %rdi
    callq   _ZNSolsEi

與往常一樣,值得注意的是,未定義行為的行為確實涵蓋了“做了您認為會做的事情”以及“不做了您想做的事”,並且此內容在此特別適用。

最初為const的const_cast值是未定義的行為,此時,您已放棄了編譯器對“正常行為”的所有權利。 現在發生的事情是編譯器編寫者認為正確的事情-如果這意味着將值實際放置在內存的只讀位中,則您的代碼將無法成功更新該值。 但是在這種情況下,它只是簡單地將x優化為常數10,而rx變為11-因為您實際上並沒有對xrx任何“其他操作”,所以按照編譯器標准是“好的”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM