Вчера я увидел интересный вопрос здесь о SO о структурированном привязке.
Мы можем подвести итог, как следует. Рассмотрим пример кода ниже:
#include <tuple>
#include <type_traits>
int main() {
auto tup = std::make_tuple(1, 2);
auto & [ a, b ] = tup;
// the following line won't compile for a isn't a reference
// static_assert(std::is_reference_v<decltype(a)>);
}
В этом случае decltype(a)
есть int
(возможно) из-за этой пули (рабочий проект):
if
e
- это несферированное id-выражение, называющее структурированное связывание [...],decltype(e)
является ссылочным типом, как указано в спецификации объявления структурированного связывания
Здесь - фрагмент на wandbox, предоставленный @Curious в комментариях для интересующих. Это показывает, что на самом деле a
не является ссылкой, не более того.
До сих пор так хорошо для оригинального вопроса, ОП спросил, почему это было int
вместо int &
, и стандарт говорит, что это был приемлемый ответ.
В любом случае, я хотел бы знать, почему комитет решил так. В конце дня a
ссылается на элемент в кортеже, и я могу изменить этот элемент через a
. Другими словами, декларация a
выглядит как ссылка, она ведет себя аналогично ссылке, но не является ссылкой.
Я могу жить с этим, но я хотел бы знать, в чем причины этого. Почему decltype(a)
не может быть просто int &
? Есть ли осмысленная причина, которую может понять профан?