Во время чтения о другой теме я наткнулся на странное поведение, по крайней мере, для меня.
Вся эта мысль возникла из -за особых взаимодействий между Auto < /code> и скобками. Если вы напишите что -то вроде: < /p>
Компилятор выведет как std :: initializer_list . Странно то, что аналогичное правило применяется не только к Auto < /code>, где для него могут быть особые причины, но и к другим вещам.
Если вы пишете следующее: < /p>
Код: Выделить всё
template
void f(std::vector Vector)
{
// do something
}
< /code>
Вы, конечно, не можете назвать это таким образом: < /p>
f({ 1, 2, 3});
< /code>
Даже если std :: vector < /code> может быть инициализирован. Однако, если вы замените std :: vector
на std :: initializer_list , вызов работает, а компилятор правильно выведет int как тип t . Однако более интересно, что в первом случае вам нужно #include , в последнем вам не нужно #include . Это заставило меня задуматься, и после теста я каким -то образом осознал std :: initiazer_list не нужен свой собственный заголовок, так что он в некотором роде является частью функций «базовые». a Operator () ). Другими словами, неназванные определения привязки должны по умолчанию с std :: initializer_list < /code> точно так же, как лямбдас (в основном) неназванные вызываемые объекты. Более того, может ли это поведение измениться, и, если да, то как? Однако остается вопрос: почему звонок работает для std :: initializer_list , а не для std :: ecector ?
Подробнее здесь:
https://stackoverflow.com/questions/529 ... and-header