什么是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 

作为voidconst 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可能是没有意义的 ,但它是有效的代码