我试图不允许对易失性类型进行特定操作。为了实现这一点,我尝试使用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);
}发布于 2017-10-05 09:38:58
问题是T根本不是volatile类型。我是volatile char*。等一下,你说,我看到volatile就在那儿。是的,但是请考虑一下:char* volatile是一个易失性类型。volatile char*不是。它是一个指向易失性char数组的非易失性指针。
解决方案:std::is_volatile<typename std::remove_pointer<T>::type>
发布于 2017-10-05 09:38:59
当尝试按值传递数组时,它会衰减为指向其第一个元素的指针。
这意味着val实际上是一个int volatile *。因此,它指向一个易失性的int,但它本身并不易变。因此,std::is_volatile返回false。
您可以尝试通过引用接收数组,或者使用std::remove_pointer。
发布于 2017-10-05 09:38:54
因为函数通过值接受它的参数,所以原始参数的cv-限定就丢失了。
以引用方式接受:
void DoStuff(T& val)https://stackoverflow.com/questions/46582265
复制相似问题