¿El siguiente programa está bien formado?
#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());
}
Según C ++ 17 [secuencia.reqmts], el requisito para
X u(i, j);
donde Xes un contenedor de secuencia, es:
TseráEmplaceConstructibleenXde*i.
Sin embargo, en el párrafo anterior se afirma que:
iyjdenotan iteradores que satisfacen los requisitos de iterador de entrada y hacen referencia a elementos implícitamente convertibles avalue_type,
Por lo tanto, me parece que ambos requisitos tendrían que cumplirse: el tipo de valor del rango debe ser implícitamente convertible al tipo de valor del contenedor y EmplaceConstructible debe cumplirse (lo que significa que el asignador debe poder realizar la inicialización requerida) . Como intno es implícitamente convertible a A, este programa debe estar mal formado.
Sin embargo, sorprendentemente, parece compilarse bajo GCC .