延續前兩篇文章的程式碼實驗
不過呼叫 foofoo() 後 const 變數 bar 底下的 const 變數 value 並沒有被還原成原本的數值
所以 GCC C++ Compiler 對 const 變數數值的還原保護僅限於直接傳入函式的變數本身
並不包含該 const 變數底下的 const 變數,到這時總算是解決了 $4 心中的疑惑
為什麼兩三年前寫 C++ 時,使用 const_cast 可以改變 const 變數的數值
而在 H4 聚會的實驗時反而遇到了跟 $4 過去經驗乍看下相衝突的結果 :-)
C++ Programming: Call by Reference/Value/Pointer and const_cast這次想要實驗的程式碼片段如下
GCC C++ Compiler 會聰明地幫你還原 const 變數的數值
#include <iostream>編譯後執行的結果為
struct Foo {
const int value;
};
void foo(const struct Foo* const);
void foofoo(const struct Foo* const);
using namespace std;
int main(int argc, char* argv[])
{
const struct Foo bar = {11};
cout << bar.value << '\t' << &bar.value << endl;
foo(&bar);
cout << bar.value << '\t' << &bar.value << endl;
foofoo(&bar);
cout << bar.value << '\t' << &bar.value << endl;
}
void foo(const struct Foo* const bar)
{
static struct Foo inner = {22};
struct Foo** tmp = const_cast<struct Foo**>(&bar);
cout << *tmp << '\t' << bar << '\t' << bar->value << endl;
*tmp = &inner;
cout << *tmp << '\t' << bar << '\t' << bar->value << endl;
}
void foofoo(const struct Foo* const bar)
{
int &value = const_cast<int&>(bar->value);
value = 22;
}
11 0xbfbb3090對照程式碼就可以發現呼叫 foo() 後 const 變數 bar 被還原成原本的數值了
0xbfbb3090 0xbfbb3090 11
0x804a034 0x804a034 22
11 0xbfbb3090
22 0xbfbb3090
不過呼叫 foofoo() 後 const 變數 bar 底下的 const 變數 value 並沒有被還原成原本的數值
所以 GCC C++ Compiler 對 const 變數數值的還原保護僅限於直接傳入函式的變數本身
並不包含該 const 變數底下的 const 變數,到這時總算是解決了 $4 心中的疑惑
為什麼兩三年前寫 C++ 時,使用 const_cast 可以改變 const 變數的數值
而在 H4 聚會的實驗時反而遇到了跟 $4 過去經驗乍看下相衝突的結果 :-)
沒有留言:
張貼留言