【问题标题】:What's the point of const void?const void 有什么意义?
【发布时间】:2011-06-30 18:55:42
【问题描述】:

显然,可以声明一个返回const void的函数:

const void foo()
{
}

g++ 似乎认为const 很重要,因为以下代码无法编译:

#include <type_traits>

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

那么const void有什么实际意义吗?

【问题讨论】:

  • 在不知道任何细节的情况下,我会说它的存在是出于正交性的原因。想象一个使用替换类型而不是限定符的元函数。它适用于所有类型,除非 void 可以隐式剥离。
  • 我现在很好奇是什么导致了这一发现。 :) 在玩编译器的中间输出,是吗?
  • @Tim:我试图决定将const 放在函数指针查找表中的哪个位置。有三个可能的位置。其中一个编译失败,最外面的const 清楚地声明了一个指向返回const void 的函数的指针数组,我很惊讶编译器接受了该代码。
  • cdecl.org 对于那些偶尔询问“这个限定词适用于什么?”的时刻很有用

标签: c++ c function constants void


【解决方案1】:

不是真的。但是忽略 void 上的 cv 限定或使其错误可能会在编译器实现和最终用户代码方面造成不必要的复杂性。考虑像

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

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

另外,虽然const void 没有帮助,但const void* 有它的用途。

【讨论】:

  • const void * 有多大用处?我可以看到 void * const 有多大,但不是前者。
  • 您可以在往返void* 土地时使用它来保持(预期的)常量性。 string read_name(enum dynamic_type, const void*)。它不是超级有用,不,但比const void 更有用。当然,void* const 很有用,但这与问题并没有密切关系。
  • @Spidey 如果您已经在将指针(一些 T*)修改为 void*(稍后再返回),那么 const void*const 等价物(所以对于一些const T*)。当然,你可以const_cast 它离开,但为什么呢?换句话说,它与任何其他const T* 一样有用,而且“非常有用”。 :)
【解决方案2】:

const void 之所以被允许,仅仅是因为没有必要让编译器将这个例外排除在一般规则之外,并且将其留在其中也无害。

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

const void * 有多大用处?我可以看到 void * const 可能是多少,但不是前者。 ——蜘蛛侠

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

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

void* 通常用作传递非特定指针的一种方式(例如使用memcpy())。 如果你想将const char* 传递给这样的函数,那么你不能使用void* 或者你会失去它指向的东西是恒定的并且不能改变的事实。当前的 C++ 编译器将拒绝编译它,因为它必须隐式地将 const 强制转换掉,这是正确的,因为此数据可能位于只读内存中,如果有任何尝试写入它,可能会导致异常。

这就是为什么memcpy() 的第二个参数是const void* 而不仅仅是void*

【讨论】:

  • 提示:用反引号替换单引号。
猜你喜欢
  • 2011-07-01
  • 2011-12-04
  • 2011-11-18
  • 2012-08-07
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
  • 2016-12-09
  • 2012-07-09
相关资源
最近更新 更多