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, é:
T
seráEmplaceConstructible
paraX
partir*i
.
No entanto, no parágrafo anterior, afirma-se que:
i
ej
denotam 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 int
não é implicitamente conversível em A
, este programa deve ser mal formado.
No entanto, surpreendentemente, parece compilar sob o GCC .