什么是const无效?

时间:2016-06-17 12:09:42

标签: c++ c++11 c++14

std::is_void的描述表明:

  

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

然后可能是const void还是volatile void

This answer表示const void返回类型无效(但在VC ++ 2015上编译)

const void foo() { }

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

3 个答案:

答案 0 :(得分:86)

const void是一种可以形成指针的类型。它类似于普通的void指针,但转换的工作方式不同。例如,const int*无法隐式转换为void*,但可以隐式转换为const void*。同样,如果您有const void*,则static_cast不能int*static_castconst 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

For Each i As ListViewItem In .ListView1.Items
 .ComboBox1.Properties.Items.Add(i.Text)
Next

答案 1 :(得分:21)

作为voidconst void是无效类型。但是,如果const void return 类型,const毫无意义(虽然合法!),因为[expr]/6

  

如果prvalue最初的类型为“ cv T”,其中T是cv非限定的非类非数组类型,其类型为   在进行任何进一步分析之前,将表达式调整为T

但是,它本身是一种有效的类型,例如在C-standard library functions,它用于确保参数指针的const正确性:int const*无法转换为void*,而是void const*

答案 2 :(得分:18)

类型可以是模板的结果;模板可能会说明const T,并使用T作为void进行实例化。

链接的答案被误导,或者说更有限,因为它考虑了非模板类型的特殊情况,即使那时const void可能无意义,但它是有效代码