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

gla*_*des 1 c++ casting void

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

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

现在我明白我可以void()像这样创建纯右值,但是我可以用它做什么以及为什么这可能?

for*_*818 5

我想你参考了这一段

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

和子弹

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

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

void bar() {
    return void();
}
Run Code Online (Sandbox Code Playgroud)

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

template <typename T>
auto foo() {
    return typename T::value_type();
}
Run Code Online (Sandbox Code Playgroud)

然后你可以用Twho value_typeis实例化它void

struct X{
    using value_type = void;
};
int main() {
    foo<X>();
}
Run Code Online (Sandbox Code Playgroud)

没有返回对象,但是T::value_type中表达式的类型foo<X>void,函数有void返回类型。