Czy następujący program jest dobrze sformułowany?
#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());
}
Zgodnie z C ++ 17 [sekwencja.reqmts] wymóg dotyczący
X u(i, j);
gdzie Xjest kontenerem sekwencji, jest:
TbędzieEmplaceConstructibledoXz*i.
Jednak w poprzednim akapicie stwierdzono, że:
iijoznaczają iteratory spełniające wymagania iteratora wejściowego i odnoszą się do elementów domyślnie konwertowalnychvalue_type,
Wydaje mi się zatem, że oba wymagania musiałyby zostać spełnione: typ wartości zakresu musi być domyślnie konwertowany na typ wartości kontenera i EmplaceConstructible musi być spełniony (co oznacza, że alokator musi być w stanie wykonać wymaganą inicjalizację) . Ponieważ intnie można go domyślnie przekonwertować A, ten program powinien być źle sformułowany.
Jednak, co zaskakujące, wydaje się , że kompiluje się w GCC .