Тип переменных в структурированном связывании - PullRequest
0 голосов
/ 24 ноября 2018
#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 Ответ

0 голосов
/ 24 ноября 2018

decltype(e) ведет себя по-разному в зависимости от того, что e задано в качестве аргумента.Для структурированного связывания decltype дает следующее: [dcl.type.simple] :

Для выражения e тип, обозначенный decltype(e), равенопределяется следующим образом:

  • , если e является не выраженным в скобках id-выражением с именем структурированной привязки, decltype(e) является ссылочным типом , как указано вспецификация объявления структурированной привязки

Ссылочный тип для объявления структурированной привязки с выражением типа массива в качестве инициализатора является типом элемента [dcl.struct.bind] :

Если E является типом массива с типом элемента T, количество элементов в списке идентификаторов должно быть равно количеству элементов E,Каждый v i является именем lvalue, которое относится к элементу i массива и типом которого является T; ссылочный тип - T.[ Примечание : cv-квалификаторы верхнего уровня для T - cv.- конечная нота ]

...