[英]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-因為您實際上並沒有對x
和rx
任何“其他操作”,所以按照編譯器標准是“好的”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.