注意以下兩種功能具有相同的類型和簽名:爲什麼參數修飾符(即'const'或'volatile')不被視爲函數類型或簽名的一部分?
void foo1(int t) {} // foo1 has type 'void(*)(int)', and signature '(*)(int)'
void foo2(const int t) {} // Also type 'void(*)(int)', signature '(*)(int)'
(該const
不是功能類型或功能簽名的一部分)。同樣,返回類型上的修飾符(const
或volatile
)不會影響函數類型或函數簽名。
但是,在函數定義本身(未顯示)中,命名變量t
確實在foo2
中保留const
資格。
有許多StackOverflow的問題,討論爲什麼函數的返回類型不被視爲函數簽名(用於重載決議)的一部分。
但是,我找不到任何StackOverflow問題,詢問爲什麼參數修飾符(const
或volatile
)不是函數的類型或簽名的一部分。另外,我直接看了C++ 11標準文檔,發現很難解開。
參數修飾符(即const
和volatile
)不屬於函數的類型或簽名的一部分的基本原理是什麼?
附錄爲了清楚起見,從下面R.MartinhoFernandes的答案,我要澄清,在C++(我認爲)的說法修飾符const
和volatile
如果他們頂級只忽略作爲函數類型/簽名的一部分級別修飾符 - 請參閱下面的答案。
返回類型*是*函數簽名的一部分。它只是不考慮解決超載問題。這兩個是不同的想法。 –
我不能給你官方的C++答案,但從用戶的角度來看,他們沒有任何區別。如果用戶調用foo1或foo2,用戶將使用int來完成此操作。在實現中,const修飾符會有效果。由於簽名基本上是界面(用戶關心的內容),所以不區分是合理的。 – RonaldBarzell
@ R.MartinhoFernandes我不這麼認爲 - 例如,請參閱http://stackoverflow.com/questions/13687607/is-the-only-purpose-of-a-function-signature-as-opp-to -type-to-define-dupl –