2014-01-21 23 views
3

我有一個C++函數重載的問題。這是一個示例類。函數重載不起作用

class test 
{ 
public: 
    const char* data() const 
    { 
    std::cout << "const char* data() const" << std::endl; 
    return data_; 
    } 

    char* data() 
    { 
    std::cout << "char* data()" << std::endl; 
    return data_; 
    } 
private: 
    char data_[512]; 
}; 

在我的例子中,我有兩個函數調用。

test t; 
const char *t1 = t.data(); 
char* t2 = t.data(); 

而我的輸出是char* data()兩次。有人能解釋我發生了什麼事嗎?爲什麼const char* data() const從未被稱爲?

感謝您的幫助。

+2

你不能超載不會奇蹟般地發生根據您的結果下了線做什麼的返回值 – StoryTeller

+0

超載。 –

+0

@StoryTeller你可以在const上通過AFAIK重載。我認爲這裏的問題是兩者之間的選擇可能只受測試的常量影響,或者如果它被用作需要const參數的函數的參數(但我不確定後者是如何)。 – Borgleader

回答

10

因爲t不是const,您會得到該方法的非常量重載。請注意,返回類型的常量不參與重載分辨率,並且您可以將char*轉換爲const char*

如果你嘗試這種

const test t; 
const char *t1 = t.data(); 

你會得到const過載,而這不會編譯:

char* t2 = t.data(); 
4

const版本將只有一個const對象上調用。

const test t; 
t.data(); 
0
test t; 
t.data(); 
static_cast<const test>(t).data(); 

這會給你想要的結果,你就不需要將其存儲爲一個臨時如圖對方的回答。

http://ideone.com/XDdacr