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>
当试图按值传递数组时,它会衰减成指向其第一个元素的指针.
这意味着val实际上是一个int volatile *.因此,它指向一个易变的int,但本身不是波动的.因此,std::is_volatile返回false.
您可以尝试通过引用或使用来获取数组std::remove_pointer.
| 归档时间: |
|
| 查看次数: |
1511 次 |
| 最近记录: |