Правильно ли сформирована следующая программа?
#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 .