2016-07-06 92 views
-1

爲什麼const在應用於struct指針而不是struct時創建不同的簽名?爲什麼const有時是函數簽名的一部分?

E.g.

typedef struct test_s { 
    int foo; 
} test; 

void foo(test *ptr){ 
    return; 
} 

// This is ok 
void foo(const test *ptr){ 
    return; 
} 

void foo(test t){ 
    return; 
} 

//This is an error 
void foo(const test t){ 
    return; 
} 

(上gcc版本4.9.2測試)

更具體而言,這是爲什麼認爲底部一個是錯誤時,一對與該指針不是錯誤。引用的重複問題(Functions with const arguments and Overloading)似乎也會爭辯說指針的情況應該是重複的。

+0

根據該函數可以採用的參數來考慮。最後2個可以採用完全相同的參數,最後一個只是任意決定使其內部副本保持不變(實現細節)。第一個不能指向常量,所以它們真的是不同的功能,從外部看。 –

回答

1
void foo(const test t){ 
    return; 
} 

是錯誤的,因爲它是一樣的:

void foo(test t){ 
    return; 
} 

這使得先前的功能的副本。


當函數參數是test*,你可以取消引用指針和修改。修改將在調用函數中可見。

void foo(test *ptr){ 
    ptr->foo = 10; // The state of the object in the calling function 
        // is changed. 
    return; 
} 

當函數參數爲const test*,你可以取消引用指針來訪問它,但不能修改它。

void foo(const test *ptr){ 
    std::cout << ptr->foo << std::endl; // OK 
    ptr->foo = 10;      // Not OK 
    return; 
} 

出於同樣的原因,你可以重載:

void foo(test& t); 
void foo(const test& t); 

當您嘗試過載

void foo(test t); 
void foo(const test t); 

二者都同樣是很好的候選人,當你調用它。編譯器無法消除這兩者之間的歧義。另外,請看one of the answers to the dupe。它引用了C++標準的部分內容,說明爲什麼最後兩個是相同的。

+2

多數民衆贊成在這個問題:爲什麼這是一個重複的例子與指針不重複? – chacham15

+0

@ chacham15編譯器可以輕鬆區分指向非常量指針和指向常量指針。或者你認爲'const test *'是一個'const'指針? – LogicStuff

+0

@LogicStuff問題是爲什麼可以區分'const test *'和'test *',而不是'const test'和'test'之間的區別? – chacham15

相關問題