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 X
adalah wadah urutan, adalah:
T
akanEmplaceConstructible
menjadiX
dari*i
.
Namun, dalam paragraf sebelumnya dinyatakan bahwa:
i
danj
menunjukkan 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 int
tidak secara implisit dikonversi ke A
, program ini harus dibuat dengan buruk.
Namun, yang mengejutkan, sepertinya dikompilasi di bawah GCC .