如何获取并使用void类型的值?

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

我得到了一段使用

void()
作为参数的代码。代码显然无法编译……?

我们可以实例化任何类型为

void
的东西吗?我相信答案是否定的,除了
void*
。例如:

  1. 编写函数
    void askVoid(void param) {}
    错误:

参数可能没有

void
类型

  1. 编写函数
    void askNaught() {}
    并使用askNaught(void())`错误调用它:

错误 C2660:

takeNaught
:函数不接受 1 个参数

  1. 编写模板化函数
    template <typename T> void takeGeneric(T param) {}
    并调用它并出现
    takeGeneric(void())
    错误:

错误 C2893:无法专门化函数模板

void takeGeneric(T)

  1. 声明
    void voidType
    错误:

不允许填写不完整的类型

  1. 声明
    auto autoVoid = void()
    错误:

无法推断

auto
类型

  1. 声明
    void* voidPtr
    工作正常,但
    remove_pointer_t<decltype(voidPtr)> decltypeVoid
    错误:

错误 C2182:

decltypeVoid
:非法使用类型
void

就是这样,对吧? C++ 中没有

void()
的位置吗?这只是我得到的错误代码,对吗?

c++ void
5个回答
12
投票

表达式

void()
void
类型的纯右值,可以在任何可以使用此类表达式的地方使用,其中 [basic.fundamental]/9 有助于提供一个列表:

  • 作为表达式语句:
    void();
  • 作为条件运算符的第二个或第三个操作数:
    true ? throw 1 : void()
  • 作为逗号运算符的操作数:
    ++it1, void(), ++it2
  • 作为
    decltype
    noexcept
    的操作数:
    using my_void = decltype(void()); static_assert(noexcept(void()), "WAT");
  • 在函数返回的
    return
    语句中(可能是 cv 限定的)
    void
    const void f() { return void(); }
  • 作为显式转换为(可能是 cv 限定的)
    void
    的操作数:
    static_cast<const void>(void())

void
类型的表达式也可以用作
typeid
的操作数,但在这种情况下,
void()
特别会被解析为类型,而不是表达式。


12
投票

C++(我说的是 C++,而不是 C)允许具有 void 返回类型的(

§6.6.3 逗号 2
)函数返回
void
表达式,即:

void foo() { return void(); }

但请注意,它不是构建临时

void


10
投票

您可以将

void()
作为函数参数:

void test(void()) { ... }

扩展为:

void test(void (*)())

这是一个函数指针,指向一个返回 void 且不带参数的方法。

完整示例:

void abc() {}
void test(void()) { }

int main() {
    test(abc);
}

4
投票

您可以使用

void()
作为可调用类型,例如
std::function<void()> f;
是一个有效的语句。

此外,从8.3.5/4开始:

由非依赖类型 void 的单个未命名参数组成的参数列表相当于空参数列表。

这意味着这是有效的:

template<typename T>
struct F;

template<typename R, typename... A>
struct F<R(A...)> { };

int main () {
   F<void(void)> s;
}

在这里,您没有实例化任何

void
类型的东西,但您正在使用它(让我说)作为可调用类型的参数列表。

不确定这是否回答了您的问题,我不清楚问题实际上是什么。


1
投票

C++ 中没有 void() 的位置吗?

作为表达式,

void()
在 C++ 中有效。

从标准来看,

$5.2.3/2 Explicit type conversion (functional notation) [expr.type.conv]

表达式

T()
,其中
T
是简单类型说明符或 非数组完整对象类型的类型名说明符或 (可能是 cv 限定的)
void
类型,创建指定的纯右值 类型,其值是通过值初始化(8.5)产生的
T
类型的对象;对于
void()
情况,未进行任何初始化。

来自 cppreference.com

新类型 ( )

如果

new_type
是对象类型,则该对象是值初始化的; 否则,不进行初始化。如果
new_type
是(可能 cv 限定)
void
,表达式是
void
纯右值。

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