簡體   English   中英

const值運行時評估

[英]const values run-time evaluation

以下代碼的輸出:

const int i= 1;
(int&)i= 2;          // or:  const_cast< int&>(i)= 2;
cout << i << endl;

1 (至少在VS2012下)

我的問題:

  • 是否定義了此行為?
  • 編譯器是否總是使用定義的常量值?
  • 是否有可能構建一個編譯器將使用最新賦值的示例?

它完全沒有定義。 你只是不能改變常量的值。

碰巧的是,編譯器會將您的代碼轉換為類似的代碼

cout << 1 << endl;

但程序也可能崩潰,或做其他事情。

如果將警告級別設置得足夠高,編譯器肯定會告訴您它不起作用。

是否定義了此行為?

此代碼的行為未由C ++標准定義,因為它嘗試修改const對象。

編譯器是否總是使用定義的常量值?

在這種情況下,編譯器使用什么值取決於實現。 C ++標准沒有強制要求。

是否有可能構建一個編譯器將使用最新賦值的示例?

可能存在編譯器修改值並使用它的情況,但它們不可靠。

答案是行為未定義。

我設法建立了這個確鑿的例子:

#include <iostream>

using namespace std;

int main(){

        const int i = 1;

        int *p=const_cast<int *>(&i);
        *p = 2;
        cout << i << endl;

        cout << *p << endl;

        cout << &i << endl;

        cout << p << endl;

        return 0;
}

其中,在gcc 4.7.2下給出:

1
2
0x7fffa9b7ddf4
0x7fffa9b7ddf4

所以,就像你擁有相同的內存地址,因為它擁有兩個不同的值。

最可能的解釋是編譯器只是用它們的文字值替換常量值。

正如其他人所說,行為是不確定的。

為了完整起見,以下是標准的引用:

(§7.1.6.1/ 4)除了可以修改任何聲明為可變的類成員(7.1.1)之外,任何在其生命周期內修改const對象的嘗試(3.8)都會導致未定義的行為。 [例如:

[...]

 const int* ciq = new const int (3); // initialized as required int* iq = const_cast<int*>(ciq); // cast required *iq = 4; // undefined: modifies a const object 

]

注意,單詞object是這個段落引用的各種對象,包括簡單的整數,如示例所示 - 不僅僅是類對象。

盡管該示例引用了指向具有動態存儲的對象的指針,但該段落的文本清楚地表明這也適用於對具有自動存儲的對象的引用。

您正在使用類似C的const_cast cast operator執行const_cast

使用const_cast不保證任何行為。

如果你這樣做,它可能會起作用,也可能不起作用。

(你知道在C ++中使用類似C的運算符是不好的做法)

是的,你可以,但只有當你將const作為只讀但不是編譯時const時,如下所示:

int y=1;
const int i= y;
(int&)i= 2;
cout << i << endl; // prints 2

C ++ const關鍵字可以是missleading,它可以是const或只讀。

暫無
暫無

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

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