[英]How to use std::is_volatile?
我試圖禁止對volatile類型進行特定操作。 為了實現這一點,我嘗試使用std::is_volatile
,但下面的代碼編譯沒有錯誤,這不是我想要的。
為什么is_volatile::value
在下面的情況下為false ?
#include <type_traits>
template<typename T>
inline void DoStuff(T val) {
static_assert(!std::is_volatile<T>::value, "No volatile types plz");
//...
}
int main() {
volatile char sometext[261];
DoStuff(sometext);
}
問題是T根本不是volatile
類型。 這是volatile char*
。 等一下,你說,我看到那里的volatile
。 是的,但請考慮一下: char* volatile
是一種易失性類型。 volatile char*
不是。 它是一個指向volatile char
數組的非易失性指針。
解決方案: std::is_volatile<typename std::remove_pointer<T>::type>
當試圖按值傳遞數組時,它會衰減成指向其第一個元素的指針。
這意味着val
實際上是一個int volatile *
。 因此,它指向一個易變的int
,但它本身並不易變。 因此, std::is_volatile
返回false。
您可以嘗試通過引用或使用std::remove_pointer
。
因為函數按值接受其參數,所以原始參數的cv限定將丟失。
通過引用接受:
void DoStuff(T& val)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.