什么是const void?


89

std::is_void状态描述为:

如果T是类型void,const void,volatile void或const volatile void ,则提供等于true的成员常数值。

那么这可能是const void,或volatile void

此答案指出const void返回类型将无效(但是在VC ++ 2015上编译)

const void foo() { }

如果按照标准,const void是无效的(VC错误),那么什么是const void


15
您链接到答案并不状态,这将是无效的,它指出,这将是“毫无意义”,这我想借此表示“不提供对任何好处void没有const。”

@hvd,答案指出编译器应就此类限定发出警告/错误。因此,我认为C ++标准不允许使用void
Ajay

2
答案表明,编译器应发出有关此类限定的警告,没有提及错误,并且错误将是错误的。该评论只是关于实现的质量,而不是一致性,但是我可以理解,从评论本身来看,这还不是很清楚。

@Ajay,标准未指定使用无意义的代码时应发出警告。gcc决定给您一个额外的提示,即该代码不会执行任何操作。但是,VC绝对没有错。
user1942027 2013年

3
@Ajay答案指出clang发出警告,并且在作者看来,其他编译器也应这样做。如果标准不允许,那将是错误,而不是警告。
molbdnilo

Answers:


94

const void是一种可以构成指向的类型。它类似于普通的void指针,但是转换的工作方式不同。例如,const int*不能将a隐式转换为a void*,但可以将其隐式转换为a const void*。同样,如果您有一个const void*,则不能将static_cast其转换为int*,但可以将static_cast其转换为const int*

const int i = 10;
void* vp = &i;                           // error
const void* cvp = &i;                    // ok
auto ip = static_cast<int*>(cvp);        // error
auto cip = static_cast<const int*>(cvp); // ok

4
尽管您的回答是好的,但它没有说明的原因const void,而是围绕void和non-void指针[具有(non-)const-ness]。
Ajay

26
@Ajay:我不同意。Aconst void*是您见过的唯一原因const void。它可能作为模板参数传递,但是该参数类型将永远只*在其末尾实例化。
本杰明·林德利

@BenjaminLindley您还可以看到const void问问题的语言律师
cpplearner

3
@阿杰:在某种程度上,这个问题变成了一个哲学问题。的“原因”const void是可以使用C ++实现所有类型const。它以现有的方式“存在” void。@Benjamin Lindley的答案解释了它的含义以及使用方式。
克里斯·贝克

23

voidconst void是空隙型。但是,如果const void返回类型,则它const是没有意义的(尽管合法!),因为[expr] / 6

如果prvalue最初具有类型“ cv T ”,其中Tcv是不合格的非类,非数组类型,则T在进行任何进一步分析之前,将表达式的类型调整为。

但是,它本身是有效的类型,并且发生在C标准库函数等中,在该函数中用于确保参数指针的const正确性:int const*不能转换为void*,而是void const*


const void因为返回类型确实会影响函数类型,所以并不是完全没有意义的。
cpplearner

1
@cpplearner除非在每种实际意义上都是如此,否则因为函数的签名和对其调用的类型均不受影响。
哥伦布

好吧,它可以更改功能模板的签名。尽管如此,还是+1
cpplearner

@cpplearner足够公平-但是,这仍然是浪费按键。
哥伦布

我们通常会看到:const int *不能变为void *,但是const void *。
mgouin

18

类型可以是模板的结果。模板可能会声明const T并用Tas实例化void

链接的答案被误导,或者说是有限的,因为它涉及非模板类型的特殊情况,即使这样const void也可能毫无意义,但这是有效的代码

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.