O programa a seguir está bem 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());
}
De acordo com o C ++ 17 [sequence.reqmts], o requisito para
X u(i, j);
onde Xé um contêiner de sequência, é:
TseráEmplaceConstructibleparaXpartir*i.
No entanto, no parágrafo anterior, afirma-se que:
iejdenotam iteradores que atendem aos requisitos do iterador de entrada e se referem a elementos implicitamente conversíveis emvalue_type,
Assim, parece-me que ambos os requisitos precisariam ser atendidos: o tipo de valor do intervalo deve ser implicitamente conversível no tipo de valor do contêiner e EmplaceConstructible deve ser atendido (o que significa que o alocador deve ser capaz de executar a inicialização necessária) . Como intnão é implicitamente conversível em A, este programa deve ser mal formado.
No entanto, surpreendentemente, parece compilar sob o GCC .