Chương trình sau đây có được hình thành tốt không?
#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());
}
Theo C ++ 17 [Sequ.reqmts], yêu cầu đối với
X u(i, j);
nơi X
chứa một chuỗi, là:
T
sẽ đượcEmplaceConstructible
vàoX
từ*i
.
Tuy nhiên, trong đoạn trước có ghi rằng:
i
vàj
biểu thị các trình vòng lặp thỏa mãn các yêu cầu của trình vòng lặp đầu vào và tham khảo các phần tử hoàn toàn có thể chuyển đổi thànhvalue_type
,
Do đó, dường như cả hai yêu cầu cần phải được đáp ứng: loại giá trị của phạm vi phải được chuyển đổi hoàn toàn thành loại giá trị của container và EmplaceConstructible
phải được thỏa mãn (có nghĩa là người cấp phát phải có thể thực hiện khởi tạo được yêu cầu) . Vì int
không hoàn toàn có thể chuyển đổi thành A
, chương trình này sẽ không được định dạng đúng.
Tuy nhiên, đáng ngạc nhiên, nó dường như được biên dịch theo GCC .