#include <type_traits>
int main()
{
int arr[1] = { 6 };
auto& ref1 = arr[0];
static_assert( std::is_same_v<decltype( ref1 ), int&> ); //ok
auto& [ ref2 ] = arr;
static_assert( std::is_same_v<decltype( ref2 ), int> ); //ok
static_assert( std::is_same_v<decltype( ref2 ), int&> ); //error
}
在该示例中,标识符ref1
和ref2
之间的相应区别是什么?据我了解,结构绑定中的ref2
也具有引用类型,但是为什么decltype
为其指示非引用类型?
答案 0 :(得分:9)
decltype(e)
的行为取决于给出的e
作为参数。对于结构化绑定,decltype
产生以下内容,[dcl.type.simple]:
对于表达式
e
,由decltype(e)
表示的类型定义如下:
- 如果
e
是未命名的 id-expression ,命名结构化绑定,则decltype(e)
是引用类型,如规范结构化绑定声明
以数组类型表达式作为初始化程序的结构化绑定声明的引用类型为元素[dcl.struct.bind]的类型:
如果
E
是元素类型为T
的数组类型,则标识符列表中的元素数应等于E
的元素数。每个 v i 是一个左值的名称,该左值引用数组的元素 i ,其类型为T
; 引用的类型为T
。 [注意:T的顶级简历限定词是简历。 — 尾注]