Il seguente programma è ben formato?
#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());
}
Secondo C ++ 17 [sequence.reqmts], il requisito per
X u(i, j);
dove si X
trova un contenitore sequenza, è:
T
deve essereEmplaceConstructible
inX
da*i
.
Tuttavia, nel paragrafo precedente si afferma che:
i
ej
denota iteratori che soddisfano i requisiti di iteratore di input e fanno riferimento a elementi implicitamente convertibili invalue_type
,
Quindi mi sembra che entrambi i requisiti debbano essere soddisfatti: il tipo di valore dell'intervallo deve essere implicitamente convertibile nel tipo di valore del contenitore e EmplaceConstructible
deve essere soddisfatto (il che significa che l'allocatore deve essere in grado di eseguire l'inizializzazione richiesta) . Poiché int
non è implicitamente convertibile in A
, questo programma dovrebbe essere mal formato.
Tuttavia, sorprendentemente, sembra compilarsi sotto GCC .