2011-03-30 66 views
1

任何人都可以告訴我爲什麼有一個編譯錯誤,下面的代碼?字符[N]與字符*

struct Foo { 
    char m_p[8]; 
    inline operator char *() const { return m_p; } 
}; 

隨着GCC 4.5,我給出的消息:

error: invalid conversion from 'const char*' to 'char*'

而數字火星編譯器沒有問題的。

編輯:下面列出的答案提到函數的const限定符。我真的不明白那麼就是爲什麼下面的代碼有沒有這樣的問題:由於函數內

struct Foo2 { 
    char *m_p; 
    inline operator char *() const { return m_p; } 
}; 
+0

這看起來很好。我認爲這裏的內容是重要的。 – 2011-03-30 21:57:38

+2

那麼,你從編譯器得到的錯誤信息是不言自明的。你有一個'const char [8]'數組,它可以被轉換爲'const char *'指針,而不是'char *'指針。 – AnT 2011-03-30 21:59:49

回答

6

由於該算子是const函數,因此this及其所有成員(m_p)應該是const。所以m_p的類型是const char[8]。由於const的性質將會丟失,因此不能隱式轉換爲char*。轉換爲const char*即可。

你既可以使其返回const char*

inline operator const char *() const { return m_p; } 

或刪除const預選賽

inline operator char *() { return m_p; } 

,或者提供這兩種方法。

數字火星在這裏是錯誤的。或者,也許你需要啓用一些警告。

+0

感謝KennyTM。我還沒有得到的是爲什麼char *而不是'char [N]'不會給出錯誤,即使在轉換運算符上有'const'。 – user2023370 2011-03-30 22:47:09

+0

當您將其更改爲指針時,成員函數的const限定僅適用於指針本身(作爲類的成員),而不是指向的對象。所以'm_p'的類型是'char * const',可以轉換爲'char *'。 – 2011-03-31 00:09:24

+0

@Mike:謝謝邁克,我現在明白了。 – user2023370 2011-03-31 08:23:00

1

(是const限定的)的陣列的類型是const char[8],並不能轉換到char*,只有const char*

或者在函數上指定const限定條件,或者將其添加到返回類型中。此外,inline在這裏是冗餘的,因爲在類定義中定義的成員無論如何都隱含地爲inline

0

您的運營商被標記爲const,因此它得到const 指針。這意味着,無論struct的領域,你會嘗試通過該this指針訪問實際上是const(因爲它正在通過const -path訪問),所以當你return m_p;m_p衰減到const char *,這反過來又可以不轉換爲char *(運營商的返回類型),因爲刪除const修改器需要const_cast

長話短說:如果你想要那個操作是const,則返回類型必須是const char *,否則你就會有這樣一種情況:const方法(=>其可在const對象上調用)會能夠讓調用者修改對象(通過非const指針返回),即使這應該被const禁止。

1

char m_p [8]和char * m_p之間的區別在於前者是對象的一部分,當從const限定的方法訪問時,它將變爲const。對於它指向其他地方的指針,你可以從const限定的方法中返回它而不強制它是const。

+0

謝謝Tomek,非常清楚。 – user2023370 2011-03-31 08:22:40