什么是 const void,它是有效的返回类型吗?

问题描述 投票:0回答:4

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
是什么?

c++ c++11 c++14 void
4个回答
98
投票

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

24
投票

void
一样,
const void
是 void 类型。但是,如果
const void
return 类型,则
const
没有意义(尽管合法!),因为 [expr]/6:

如果纯右值最初具有类型“cv

T
”,其中
T
是 cv 未限定的非类、非数组类型,则 在进行任何进一步分析之前,将表达式调整为
T

但是,它本身是一个有效的类型,并且出现在例如C 标准库函数,用于确保参数指针的 const 正确性:

int const*
无法转换为
void*
,但可以转换为
void const*


19
投票

类型可以是模板的结果;模板可能会声明

const T
,并使用
T
实例化为
void

链接的答案被误导,或者更确切地说,其观点受到限制,因为它考虑了非模板类型的特殊情况,即使如此,

const void
可能是无意义,但它是有效代码


0
投票

我遇到在查找表的实现中需要使用 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
}

它看起来不是特别美观,但我还没有找到更优雅的方式来实现我的意图。所以总而言之,我想说在这种情况下使用它是完全合理的,也许在我没有考虑过的其他情况下使用。

© www.soinside.com 2019 - 2024. All rights reserved.