const无效的意义何在?

时间:2011-02-20 15:34:23

标签: c++ c function 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有什么实际意义吗?

2 个答案:

答案 0 :(得分:44)

不是真的。但是忽略 cv - 对void的限制或使它们出错可能会在编译器实现和最终用户代码方面产生不必要的复杂性。考虑像

这样的模板
  template<typename T>
  const T ...

没有理由在这种情况下使用void作为一种特殊情况(比现在更多),它只会造成头痛。

此外,虽然const void无效,但const void*有其用途。

答案 1 :(得分:11)

const void是允许的,因为没有必要让编译器将一个例外规则排除在一般规则之外,将它留在其中并没有坏处。

上面有一些讨论const void*不是很有用:

  

const void *有用吗?我可以看到void * const是怎样的,但不是前者。 -Spidey

事实上,const void*有时是必不可少的。 它声明被指向的东西是只读而不是void* const,它只声明指针本身是常量而不是它所指向的东西。

根据我的经验,使用const void*指向常量的指针在两种形式中更有用。当然,还有const void* const意味着指针和它指向的东西都是不变的。

void*通常用作传递非特定指针的方法(例如使用memcpy())。 如果你想将const char*传递给这样一个函数,那么你就不能使用void*,或者你失去了它所指向的东西是不变的并且不能被改变的事实。当前的C ++编译器将拒绝编译它,因为它必须隐式地转换const,并且理所当然,因为这些数据可能在只读内存中,并且如果有任何东西试图写入它可能会导致异常。 / p>

这就是memcpy()的第二个参数是const void*而不仅仅是void*的原因。