конструкторы списка инициализаторов в С++ часто вызывают проблемы; например
using std::vector;
using std::string;
vector<string> v{3}; // vector of three empty strings
vector<int> u{3}; // vector of one element with value 3
(Просто для уточнения, я имею в виду конструктор <int>
- это конструктор списка инициализаторов, а <string>
- нет.)
Случай int
соответствует конструктору списка инициализаторов, а случай string
- нет. Это несколько уродливо и часто вызывает проблемы. Это также было отмечено в ранней главе (пункт 7) в "Эффективном современном С++" Скотта Мейерса, и он описывает ее как несколько неприятную часть стандарта, когда всякий раз, когда имеется конструктор списка инициализаторов, компиляторы будут проходить через обручи, чтобы попытаться сопоставьте его, придав ему приоритет над каждым другим конструктором.
Конечно, случай int можно легко зафиксировать, изменив u{3}
на u(3)
, но это не точка.
Является ли это желательным поведением? Были ли какие-либо обсуждения или планы со стороны стандартного комитета С++ для устранения этого типа двусмысленности/неприятности? Один пример требует, чтобы конструкторы списка инициализаторов вызывались следующим образом: vector<int> u({3})
, который уже в настоящее время является законным.