什么是const无效?

Aja*_*jay 84 c++ c++11 c++14

std::is_void状态描述:

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

那可能是什么const void,或者是volatile void什么?

这个答案表明const void返回类型无效(但是在VC++ 2015上编译)

const void foo() { }
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*ley 87

const void是一种可以形成指针的类型.它类似于普通的void指针,但转换的工作方式不同.例如,a const int*不能隐式转换为a void*,但可以隐式转换为a const void*.同样,如果你有一个const void*你不能static_castint*,但你可以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
Run Code Online (Sandbox Code Playgroud)

  • @Ajay:我不同意.`const void*`是你见过`const void`的唯一原因.它可能作为模板参数传递,但该参数类型只会在其末尾用`*`实例化. (26认同)
  • 虽然你的答案是好的,但它并没有说明`const void`的原因,而是它的所有围绕void和非void指针[with(non)const-ness]. (3认同)
  • @Ajay:在某些时候,这个问题成为一个哲学问题.`const void`的"原因"是C++中的所有类型都可以成为`const`.它"存在"的方式与"void"存在的方式相同.@Benjamin Lindley的回答解释了当你看到它以及如何使用它时它是什么. (3认同)

Col*_*mbo 21

因为void,const void是一种无效的类型.但是,如果const void返回类型,const则没有意义(虽然合法!),因为[expr]/6:

如果prvalue最初具有类型" cv T ",其中T是cv非限定的非类非数组类型,则表达式的类型T在任何进一步分析之前被调整.

但是,它本身就是一个有效类型,并且出现在例如C标准库函数中,它用于确保参数指针的const正确性:int const*无法转换为void*,但是void const*.


Dev*_*lar 18

类型可以是模板的结果; 模板可能会声明const T,并使用Tas 进行实例化void.

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