Тип переменных в структурированном связывании

#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. - конец примечания ]

Другие вопросы по тегам