Le programme suivant est-il bien formé?
#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());
}
Selon C ++ 17 [sequence.reqmts], l'exigence de
X u(i, j);
où X
est un conteneur de séquence, est:
T
doit êtreEmplaceConstructible
àX
partir de*i
.
Cependant, au paragraphe précédent, il est indiqué que:
i
etj
désignent des itérateurs satisfaisant aux exigences des itérateurs d'entrée et font référence à des éléments implicitement convertibles envalue_type
,
Ainsi, il me semble que les deux exigences devraient être remplies: le type de valeur de la plage doit être implicitement convertible en type de valeur du conteneur, et EmplaceConstructible
doit être satisfait (ce qui signifie que l'allocateur doit pouvoir effectuer l'initialisation requise) . Puisqu'il int
n'est pas implicitement convertible en A
, ce programme devrait être mal formé.
Cependant, étonnamment, il semble compiler sous GCC .