如何使用std :: is_volatile?

Mat*_*Mut 19 c++ templates static-assert c++11

我试图禁止对volatile类型进行特定操作.为了实现这一点,我试图使用std::is_volatile,但下面的代码编译没有错误,这不是我想要的.

为什么在下面的情况下是is_volatile::value 的?

#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);
}
Run Code Online (Sandbox Code Playgroud)

MSa*_*ers 28

问题是T根本不是一种volatile类型.是的volatile char*.等一下,你说,我看到了volatile.没错,但请考虑一下:char* volatile是一种易变的类型.volatile char*不是.它是指向易失性char数组的非易失性指针.

解: std::is_volatile<typename std::remove_pointer<T>::type>

  • 更好的解决方案:`inline void DoStuff(T*val)`?接受一个`T`然后剥离指针似乎比接受一个'T*`更不明智. (4认同)

Que*_*tin 9

当试图按值传递数组时,它会衰减成指向其第一个元素的指针.

这意味着val实际上是一个int volatile *.因此,它指向一个易变的int,但本身不是波动的.因此,std::is_volatile返回false.

您可以尝试通过引用或使用来获取数组std::remove_pointer.