什么是 void() 纯右值以及如何使用它?

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

阅读 cppreference 对 函数式风格转换 的描述,我偶然发现了以下对

void()
的解释:

如果目标类型是(可能是 cv 限定的)void,则表达式是没有结果对象的 void 纯右值 (C++17 起)

现在我明白我可以像这样创建一个

void()
纯右值,但是我可以用它做什么以及为什么这可能?

c++ casting void
1个回答
1
投票

我想你参考了这一段

  1. 函数式转换表达式由一个简单的类型说明符或一个 typedef 说明符(换句话说,一个单字类型名称,即
    unsigned int(expression)
    int*(expression)
    等情况无效)组成,后跟一个括号中以逗号分隔的表达式列表。

还有子弹

  • 如果括号中没有表达式:如果 target-type 命名一个非数组完整对象类型,则该表达式是 target-type 类型的纯右值,指定一个临时对象(C++17 之前),其结果对象是(可能添加了cv-qualifiers) (C++17 起) 该类型。如果 target-type 是对象类型,则该对象是值初始化的。如果目标类型是(可能是 cv 限定的)
    void
    ,则表达式是没有结果对象的 void 纯右值 (C++17 起)。

如果抛开标准语言,其实没那么复杂。我想你想知道为什么有人会写这样的东西:

void bar() {
    return void();
}

根据上面的说法,这是有效的,但并不是真正有用。现在考虑你有一个像这样的函数模板:

template <typename T>
auto foo() {
    return typename T::value_type();
}

然后你可以用一个

T
来实例化它,其
value_type
void

struct X{
    using value_type = void;
};
int main() {
    foo<X>();
}

没有返回对象,但

T::value_type
中的表达式
foo<X>
的类型为
void
,函数有
void
返回类型。

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