阅读 cppreference 对 函数式风格转换 的描述,我偶然发现了以下对
void()
的解释:
如果目标类型是(可能是 cv 限定的)void,则表达式是没有结果对象的 void 纯右值 (C++17 起)
现在我明白我可以像这样创建一个
void()
纯右值,但是我可以用它做什么以及为什么这可能?
我想你参考了这一段
- 函数式转换表达式由一个简单的类型说明符或一个 typedef 说明符(换句话说,一个单字类型名称,即
和unsigned int(expression)
等情况无效)组成,后跟一个括号中以逗号分隔的表达式列表。int*(expression)
还有子弹
- 如果括号中没有表达式:如果 target-type 命名一个非数组完整对象类型,则该表达式是 target-type 类型的纯右值,指定一个临时对象(C++17 之前),其结果对象是(可能添加了cv-qualifiers) (C++17 起) 该类型。如果 target-type 是对象类型,则该对象是值初始化的。如果目标类型是(可能是 cv 限定的)
,则表达式是没有结果对象的 void 纯右值 (C++17 起)。void
如果抛开标准语言,其实没那么复杂。我想你想知道为什么有人会写这样的东西:
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
返回类型。