#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 указывает для него тип, на который нет ссылки?

9
user3514538 24 Ноя 2018 в 22:22

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

9
Piotr Skotnicki 24 Ноя 2018 в 20:04