Тип переменных в структурированном связывании
#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
указать несвязанный тип для него?
1 ответ
decltype(e)
ведет себя по-разному в зависимости от того, что e
дается в качестве аргумента. Для структурированного связывания, decltype
дает следующее, [dcl.type.simple]:
Для выражения
e
тип обозначенdecltype(e)
определяется следующим образом:
- если
e
это не заключенное в скобки id-выражение, обозначающее структурированную привязку,decltype(e)
ссылочный тип, указанный в спецификации объявления структурированной привязки
Указанный тип для объявления структурированной привязки с выражением типа массива в качестве инициализатора является типом элемента [dcl.struct.bind]:
Если
E
тип массива с типом элементаT
количество элементов в списке идентификаторов должно быть равно количеству элементовE
, Каждый vi - это имя lvalue, которое ссылается на элемент i массива и тип которого равенT
; ссылочный типT
, [ Примечание: cv-квалификаторы верхнего уровня для T - cv. - конец примечания ]