簡體   English   中英

如何使用std :: is_volatile?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM