Это следствие того, как распределитель по умолчанию создает A
. Когда вы делаете A a{foo, bar}
, вы используете инициализацию списка, и для выдачи диагноза c требуется сужающее преобразование. Распределитель по умолчанию использует
::new (static_cast<void*>(p)) T(std::forward<Args>(args)...)
, где p
- указатель на элемент векторных данных, а T
- value_type
вектора. Здесь они используют скобки вместо скобок, а с скобками разрешены сужающие преобразования, поэтому вы не увидите сообщение о диагностике c.
Если вы написали свой собственный распределитель, который выполнил
::new (static_cast<void*>(p)) T{std::forward<Args>(args)...}
Тогда вы получите предупреждение.