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 X
jest kontenerem sekwencji, jest:
T
będzieEmplaceConstructible
doX
z*i
.
Jednak w poprzednim akapicie stwierdzono, że:
i
ij
oznaczają 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ż int
nie 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 .