const void的意义何在?

What's the point of const void?

提问人:fredoverflow 提问时间:2/20/2011 更新时间:2/18/2015 访问量:24253

问:

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

const void foo()
{
}

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

#include <type_traits>

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

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

C++ C 函数 常量 void

评论

7赞 ltjax 2/20/2011
在不知道任何细节的情况下,我会说它是出于正交性的原因。想象一个元函数,它采用替换类型,但不替换限定符。它适用于所有类型,但如果可以隐式剥离 void,则 void 除外。
1赞 Tim Post 2/20/2011
我现在很好奇是什么导致了这个发现。:)我们玩编译器的中间输出,是吗?
0赞 fredoverflow 2/20/2011
@Tim:我试图决定将函数指针查找表放在什么位置。有三个可能的地点。其中一个编译失败,最外层清楚地声明了一个指向返回函数的指针数组,我很惊讶编译器接受了该代码。constconstconst void
2赞 John Bartholomew 12/13/2013
cdecl.org 对于偶尔问“这个限定词适用于什么”的时刻很有用。

答:

50赞 Logan Capaldo 2/20/2011 #1

没有。但是,忽略 void 上的 cv 限定或使它们出错可能会在编译器实现和最终用户代码方面造成不必要的复杂性。考虑像这样的模板

  template<typename T>
  const T ...

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

此外,虽然没有帮助,但有其用途。const voidconst void*

评论

2赞 Spidey 3/20/2012
const void * 有多大用处?我可以看到 * const 可能是多么虚无,但不是前者。
6赞 Logan Capaldo 3/20/2012
您可以使用它来在陆地上往返时保持(预期的)恒常性。.它不是超级有用,不,但比.当然是有用的,但这与问题并不真正相关。void*string read_name(enum dynamic_type, const void*)const voidvoid* const
1赞 Lightness Races in Orbit 8/9/2018
@Spidey 如果你已经在做一些事情,比如黑客指针(一些)进入(稍后再回来),那么是等价的(所以对于某些人来说)。当然,你可以把它带走,但为什么呢?换句话说,它和其他任何工具一样有用,而且“相当多”。:)T*void*const void*constconst T*const_castconst T*
15赞 Sie Raybould 12/13/2013 #2

const void之所以被允许,仅仅是因为没有必要让编译器踢出这个一般规则的例外,而且保留它也没有坏处。

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

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

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

根据我的经验,指向常量使用的指针是两种形式中更有用的。当然,这也意味着指针和它所指向的事物都是恒定的。const void*const void* const

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

这就是为什么第二个论点是,而不仅仅是.memcpy()const void*void*

评论

0赞 Karoly Horvath 11/22/2014
提示:用反引号替换单引号。