首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用std::is_volatile?

如何使用std::is_volatile?
EN

Stack Overflow用户
提问于 2017-10-05 09:32:39
回答 3查看 1.5K关注 0票数 19

我试图不允许对易失性类型进行特定操作。为了实现这一点,我尝试使用std::is_volatile,但是下面的代码是编译时没有错误的,这不是我想要的。

为什么is_volatile::value false出现在下面的情况中?

代码语言:javascript
复制
#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);
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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>

票数 28
EN

Stack Overflow用户

发布于 2017-10-05 09:38:59

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

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

您可以尝试通过引用接收数组,或者使用std::remove_pointer

票数 9
EN

Stack Overflow用户

发布于 2017-10-05 09:38:54

因为函数通过值接受它的参数,所以原始参数的cv-限定就丢失了。

以引用方式接受:

代码语言:javascript
复制
void DoStuff(T& val)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46582265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档