Я знаю, что могу
auto&& bla = something();
и в зависимости от const
ности возвращаемого значения something
, я хотел бы получить другой тип для bla
.
Это также работает в случае структурированных привязок, например
auto&& [bla, blabla] = something();
Я бы так догадался (структурированные привязки копируются на auto
инициализаторы, которые ведут себя так), но я не могу найти окончательное да.
Обновление: предварительные тесты, похоже, делают то, что я ожидаю (const
константу должным образом):
#include <tuple>
using thing = std::tuple<char, int*, short&, const double, const float&>;
int main()
{
char c = 0;
int i = 1;
short s = 2;
double d = 3.;
float f = 4.f;
thing t{c, &i, s, d, f};
auto&& [cc, ii, ss, dd, ff] = t;
c = 10;
*ii = 11;
ss = 12;
dd = 13.;
ff = 14.f;
}
Live demo, дает ошибку, как я ожидал бы, если auto&&
выполняет свою работу:
main.cpp: In function 'int main()':
main.cpp:20:10: error: assignment of read-only reference 'dd'
dd = 13.;
^~~
main.cpp:21:10: error: assignment of read-only reference 'ff'
ff = 14.f;
Мне все равно хотелось бы узнать, где именно указано это поведение.
Примечание. Использование "ссылок на пересылку" означает, что это поведение может растягивать его, но у меня нет хорошего имени, чтобы дать часть const
aut auto&&
(или template- T&&
на то пошло).