如何使用std::is_volatile?

How to use std::is_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);
}

因为函数按值接受其参数,原始参数的 cv 限定丢失。

参考采纳:

void DoStuff(T& val)

问题是 T 根本不是 volatile 类型。是 volatile char*。等一下,你说,我看到 volatile 就在那里。是的,但考虑一下:char* volatile 是一个可变类型。 volatile char* 不是。它是指向易失性 char 数组的非易失性指针。

解决方案:std::is_volatile<typename std::remove_pointer<T>::type>

尝试按值传递数组时,它会退化为指向其第一个元素的指针。

这意味着val实际上是一个int volatile *。因此,它指向一个 volatile int,但它本身不是 volatile。因此,std::is_volatile returns 错误。

您可以尝试通过引用或使用 std::remove_pointer.

获取数组