显然,可以声明一个返回 const void
的函数:
const void foo()
{
}
由于以下代码无法编译,因此g++似乎认为const
很重要:
#include <type_traits>
static_assert(std::is_same<void(), const void()>::value, "const matters");
那么,const void
有任何实际意义吗?
显然,可以声明一个返回 const void
的函数:
const void foo()
{
}
由于以下代码无法编译,因此g++似乎认为const
很重要:
#include <type_traits>
static_assert(std::is_same<void(), const void()>::value, "const matters");
那么,const void
有任何实际意义吗?
template<typename T>
const T ...
在那种情况下,没有理由使使用 void 成为一个特殊情况(比它已经是的更加特别),这只会带来麻烦。
另外,虽然 const void
没有用处,但是 const void*
有其用途。
void*
地带回时保持不变。 string read_name(enum dynamic_type, const void*)
。虽然不是非常有用,但比 const void
更有用。当然,void* const
也很有用,但这与问题无关。 - Logan CapaldoT*
)强制转换为 void*
(然后再转回来)这样的事情,那么 const void*
就是 const
等效的类型(对于一些 const T*
)。当然,你可以使用 const_cast
来去除它,但为什么呢?换句话说,它与任何其他 const T*
一样有用,而且这很有用。 :) - Lightness Races in Orbitconst void
被允许,因为没有必要让编译器对一个普遍规则做出一个特殊的例外,而且保留它也不会有什么害处。
上面有一些关于const void*
不是很有用的讨论:
const void *有多有用?我能看出void * const可能有用,但前者不行。 -Spidey
实际上,const void*
有时是必要的。
它声明所指的内容是只读的,与之相反的是void* const
,它只声明指针本身是常量,但并不是它所指的东西是常量。
从我的经验来看,使用const void*
作为指向常量的指针是这两种形式中更有用的。当然,还有const void* const
,表示指针和它指向的内容都是常量。
void*
通常用作传递非具体指针的方法(例如,使用memcpy()
)。
如果你想将const char*
传递给这样的函数,那么你不能使用void*
,否则你将失去它指向的内容是常量且不能被改变的事实。当前的C++编译器将拒绝编译,因为它必须隐式地强制转换掉const
,这样做是正确的,因为这些数据可能在只读内存中,并且如果任何东西尝试写入它,可能会导致异常。
这就是为什么memcpy()
的第二个参数是const void*
而不是简单的void*
。