fre*_*low 59 c c++ const function void
显然,可以声明一个函数返回const void:
const void foo()
{
}
Run Code Online (Sandbox Code Playgroud)
g ++似乎认为const很重要,因为下面的代码不能编译:
#include <type_traits>
static_assert(std::is_same<void(), const void()>::value, "const matters");
Run Code Online (Sandbox Code Playgroud)
那const void有什么实际意义吗?
Log*_*ldo 44
并不是的.但忽略对void的cv -qualifications或使它们出错可能会在编译器实现和最终用户代码方面产生不必要的复杂性.考虑类似的模板
template<typename T>
const T ...
Run Code Online (Sandbox Code Playgroud)
没有理由在这种情况下使用void作为特殊情况(比现在更多),它只会造成头痛.
此外,虽然const void没有帮助,但const void*有它的用途.
小智 11
const void 是允许的仅仅是因为没有必要让编译器将一个例外的规则踢出一般规则并且留下它没有任何害处.
上面有一些讨论const void*不是很有用:
const void*有用吗?我可以看到void*const是怎样的,但不是前者.-Spidey
事实上const void*有时是必不可少的.它声明被指向的东西是只读的,相反void* const只是声明指针本身是常量而不是它所指向的东西.
根据我的经验,指向常量使用的指针const void*是两种形式中更有用的.当然,还有一个const void* const意思是指针和它指向的东西都是不变的.
void*通常用作传递非特定指针的方法(例如with memcpy()).如果你想传递一个const char*这样的函数然后你不能使用void*或你失去了它指向的东西是不变的事实,不能改变.当前的C++编译器将拒绝编译它,因为它必须隐式地抛弃它const,并且正确地如此,因为这些数据可能在只读存储器中并且如果有任何东西试图写入它可能导致异常.
这就是为什么第二个论点memcpy()是const void*,而不仅仅是void*.