2015-09-29 33 views
1

我正在閱讀關於const_cast的內容,它似乎不安全並且沒有什麼幫助。在這樣best answer它指出了這將是在這樣的情況下非常有用:檢查變量是否合格

void func(const char* param, bool modify){ 
    if(modify) 
     //const_cast and change param 
    // stuff that do not change param 
} 

雖然這是一個可能的用途,它有它的風險,因爲你必須正確地提供「修改」的價值,否則你會得到一個不確定的行爲,因爲你正在改變一些應該是不變的東西。我不知道你是否可以實現相同的功能,而不必提供這個額外的參數,並且你很可能需要檢查const限定符的存在。

的關閉,我發現是STD功能is_const的事情,但它似乎被限制在一個不同的用法:

is_const<const int>::value //returns true 
is_const<int>::value // returns false 
const int myVar=1; 
is_const<myVar>::value // what it would look like (does not compile) 

我已經使用類似的函數簽名,僅相差也嘗試了「 const「限定符,但這被認爲是重新定義。那麼有可能做到這一點?如果是這樣,該怎麼辦?

回答

8

您可以使用std::is_const<decltype(myVar)>::value檢查myVar是否已被宣告爲const

但是,如果myVar是指向另一個對象的指針或引用,則無法從該函數內部知道該對象是否爲const

+0

'remove_reference_t'有時也是有用的。 – Yakk

+0

我不確定OP是否理解它的正確用法。在提供的示例中,它不會以任何方式幫助OP。 – SergeyA

+0

@SergeyA雖然問題是關於調用者的方面,但我確實誤讀了。但是無法知道'const'指針或引用是否從內部引用實際的'const'對象... – Quentin