Правильно ли сформирована следующая программа?
#include <vector>
struct A {
explicit A(int) {}
};
int main() {
std::vector<int> vi = {1, 2, 3, 4, 5};
std::vector<A> va(vi.begin(), vi.end());
}
Согласно C ++ 17 [sequence.reqmts], требование для
X u(i, j);
где Xконтейнер последовательности, это:
Tдолжен бытьEmplaceConstructibleвXот*i.
Однако в предыдущем абзаце указано, что:
iиjобозначают итераторы, удовлетворяющие требованиям входных итераторов, и ссылаются на элементы, неявно преобразуемые вvalue_type,
Таким образом, мне кажется, что оба требования должны быть выполнены: тип значения диапазона должен быть неявно конвертируемым в тип значения контейнера и EmplaceConstructible должен быть удовлетворен (что означает, что распределитель должен быть в состоянии выполнить требуемую инициализацию) , Поскольку эта программа не может быть intпреобразована в неявно A, она должна быть некорректной.
Однако, что удивительно, похоже, что компилируется в GCC .