我知道
void&
是无效的。但是,还有其他不可引用的类型吗?
std::add_rvalue_reference
也不会为带有 cv 限定符或 ref 限定符的函数类型创建引用类型。例如
cout << boolalpha << is_reference_v<add_rvalue_reference_t<void() const>> << endl; // false
cout << boolalpha << is_reference_v<add_rvalue_reference_t<void() volatile>> << endl; // false
cout << boolalpha << is_reference_v<add_rvalue_reference_t<void() const volatile>> << endl; // false
cout << boolalpha << is_reference_v<add_rvalue_reference_t<void() &>> << endl; // false
cout << boolalpha << is_reference_v<add_rvalue_reference_t<void() &&>> << endl; // false
可引用类型定义如下:
以下类型统称为可引用类型:
对于任何可引用类型
,都可以创建对其的引用。T
我们还需要对象类型的定义(上面的链接):
- 对象类型是(可能是 cv 限定的)类型,但不是函数类型、引用类型或可能是 cv 限定的类型
(另请参见void
);std::is_object
下表列出了类型分类 (C++23) 中的所有类型,并确定哪一个是对象类型,如果不是,则是什么类型。
类型 | 对象类型? |
---|---|
基本类型 /
|
空型 |
基本类型 /
|
对象类型 |
基本类型/算术类型 | 对象类型 |
复合类型/引用类型 | 参考类型 |
复合类型/指针类型 | 对象类型 |
复合类型/指向成员类型的指针 | 对象类型 |
复合类型/数组类型 | 对象类型 |
复合类型/函数类型 | 功能类型 |
复合类型/枚举类型 | 对象类型 |
化合物类型/类类型 | 对象类型 |
从定义和上表可以看出,哪些类型是不可引用的:
void
,其余可参考。