我想你参考了这一段
- 函数式类型转换表达式由一个简单的类型说明符或 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返回类型。