如何使用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
.
获取数组
我试图禁止对可变类型执行特定操作。为此,我尝试使用 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
.