В стандарте С++ 2011 введено новое ключевое слово auto
, которое может использоваться для определения переменных вместо типа, т.е.
auto p=make_pair(1,2.5); // pair<int,double>
auto i=std::begin(c), end=std::end(c); // decltype(std::begin(c))
Во второй строке i
и end
имеют один и тот же тип, называемый auto
. Стандарт не позволяет
auto i=std::begin(container), e=std::end(container), x=*i;
когда x
будет другого типа. Мой вопрос: почему стандарт не позволяет эту последнюю строку? Это может быть разрешено путем интерпретации auto
не как представляющего некоторый тип, подлежащий декодированию, а как указание на то, что тип любой объявленной переменной auto
должен быть выведен из его назначенного значения. Есть ли веская причина для того, чтобы стандарт С++ 11 не выполнял этот подход?
На самом деле существует прецедент для этого, а именно в инструкции инициализации цепей for
:
for(auto i=std::begin(c), end=std::end(c), x=*i; i!=end; ++i, x+=*i)
{ ... }
когда область переменных i
, end
и x
ограничена циклом for
. AFAIK, этого не может быть достигнуто в С++, если эти переменные не имеют общего типа. Правильно ли это? (уродливые трюки для размещения всех типов внутри struct
)
В некоторых приложениях с вариационным шаблоном также могут быть варианты использования.