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ù Xest un conteneur de séquence, est:
Tdoit êtreEmplaceConstructibleàXpartir de*i.
Cependant, au paragraphe précédent, il est indiqué que:
ietjdé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 intn'est pas implicitement convertible en A, ce programme devrait être mal formé.
Cependant, étonnamment, il semble compiler sous GCC .