std::is_void
的描述指出:
提供等于 true 的成员常量值,如果 T 是 类型 void, const void, volatile void, 或 const 易失性 void。
那么
const void
或 volatile void
可能是什么?
这个答案指出
const void
返回类型将无效(但是在VC++ 2015上编译)
const void foo() { }
如果按照标准,
const void
无效(VC错误)-那么const void
是什么?
const void
是一种可以形成指针的类型。它与普通的 void 指针类似,但转换的工作方式不同。例如,const int*
无法隐式转换为 void*
,但可以隐式转换为 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
类型可以是模板的结果;模板可能会声明
const T
,并使用 T
实例化为 void
。
链接的答案被误导,或者更确切地说,其观点受到限制,因为它考虑了非模板类型的特殊情况,即使如此,
const void
可能是无意义,但它是有效代码。
我遇到在查找表的实现中需要使用 const void 的情况。我的目的是创建一个指向例程的常量指针列表。
创建例程时,我需要有一个 const void return 以防止编译器抱怨。
const void lookup_1(void* v)
{
printf("This is lookup 1\r\n");
}
const void lookup_2(void* v)
{
printf("This is lookup 2\r\n");
}
const void(*lookup_table[])(void*) =
{
lookup_1,
lookup_2
}
它看起来不是特别美观,但我还没有找到更优雅的方式来实现我的意图。所以总而言之,我想说在这种情况下使用它是完全合理的,也许在我没有考虑过的其他情况下使用。