What's the point of const void?

不问归期 提交于 2019-12-18 03:00:41

问题


Apparently, it is possible to declare a function returning const void:

const void foo()
{
}

g++ seems to consider the const important, because the following code does not compile:

#include <type_traits>

static_assert(std::is_same<void(), const void()>::value, "const matters");

So does const void have any practical significance?


回答1:


Not really. But to ignore cv-qualifications on void or to make them errors could create unnecessary complexity in terms of both compiler implementation and end-user code. Consider templates like

  template<typename T>
  const T ...

There's no reason to make using void in that scenario a special case (more than it already is), it would just create headaches.

Also, while const void isn't helpful, const void* has its uses.




回答2:


const void is allowed simply because there is no point making the compiler kick out this one exception to a general rule and it does no harm to leave it in.

There is some discussion above that const void* is not very useful:

How useful is const void *? I can see how void * const could be, but not the former. –Spidey

In fact const void* is sometimes essential. It declares that the thing being pointed to is read only as opposed to void* const which only declares that the pointer itself is constant but not the thing it points to.

From my experience, the pointer to constant using const void* is the more useful of the two forms. Of course, there is also const void* const meaning that both the pointer and the thing it points to are constant.

void* is normally used as a way to pass non-specific pointers around (e.g. with memcpy()). If you want to pass a const char* to such a function then you cannot use void* or you lose the fact that the thing it points to is constant and cannot be altered. Current C++ compilers will refuse to compile that as it would have to implicitly cast the const away, and rightfully so as this data might be in read-only memory and possibly cause an exception if anything tries to write to it.

This is why the second argument to memcpy() is const void* and not simply void*.



来源:https://stackoverflow.com/questions/5057987/whats-the-point-of-const-void

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!