Apakah program berikut ini terbentuk dengan baik?
#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());
}
Menurut C ++ 17 [sequence.reqmts], persyaratan untuk
X u(i, j);
di mana Xadalah wadah urutan, adalah:
TakanEmplaceConstructiblemenjadiXdari*i.
Namun, dalam paragraf sebelumnya dinyatakan bahwa:
idanjmenunjukkan iterator yang memenuhi persyaratan input iterator dan merujuk pada elemen yang secara implisit dapat dikonversi kevalue_type,
Jadi menurut saya kedua persyaratan tersebut harus dipenuhi: tipe nilai dari rentang harus secara implisit dapat dikonversi ke tipe nilai kontainer, dan EmplaceConstructible harus dipenuhi (yang berarti pengalokasi harus dapat melakukan inisialisasi yang diperlukan) . Karena inttidak secara implisit dikonversi ke A, program ini harus dibuat dengan buruk.
Namun, yang mengejutkan, sepertinya dikompilasi di bawah GCC .