什么是const void?
std::is_void
的描述规定:
如果T是typesvoid,const void,volatile void或const volatile void,则提供等于true的成员常数值。
那么什么可能是const void
,或者是一个volatile void
?
这个答案指出, const void
返回types将是无效的(但在VC ++ 2015编译)
const void foo() { }
如果按照标准, const void
是无效的(VC是错误的),那么什么是const void
?
const void
是一个可以形成指针的types。 它与普通的空指针类似,但是转换的工作方式不同。 例如, const int*
不能隐式转换为void*
,但可以隐式转换为const void*
。 同样,如果你有一个const void*
你不能static_cast
它到一个int*
,但是你可以static_cast
它到一个const int*
。
const int i = 10; void* vp = &i; // error const void* cvp = &i; // ok auto ip = static_cast<int*>(cvp); // error auto cip = static_cast<const int*>(cvp); // ok
作为void
, const void
是一个voidtypes。 但是,如果const void
是一个返回types,那么这个const
是无意义的(尽pipe合法!),因为[expr] / 6 :
如果一个prvalue最初的types是“ cv
T
”,其中T
是一个cv不合格的非类非数组types,那么在进一步分析之前,expression式的types被调整为T
然而,它本身是一个有效的types,并且出现在例如C标准库函数中 ,用于确保参数指针的常量正确性: int const*
不能转换为void*
,而是void const*
。
types可以是模板的结果; 一个模板可能会声明const T
,并被T
实例化为void
。
链接的答案是误导的,或者说是有限的,因为它认为非模板类型的特殊情况,即使这样, const void
可能是没有意义的 ,但它是有效的代码 。