Ist das folgende Programm gut formuliert?
#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());
}
Gemäß C ++ 17 [sequence.reqmts] ist die Anforderung für
X u(i, j);
Wo Xist ein Sequenzcontainer, ist:
TsollEmplaceConstructibleinXvon sein*i.
Im vorhergehenden Absatz heißt es jedoch:
iundjbezeichnen Iteratoren, die die Anforderungen an Eingabe-Iteratoren erfüllen, und beziehen sich auf Elemente, die implizit konvertierbar sind invalue_type:
Daher scheint es mir, dass beide Anforderungen erfüllt sein müssten: Der Werttyp des Bereichs muss implizit in den Werttyp des Containers konvertierbar sein und EmplaceConstructible erfüllt sein (was bedeutet, dass der Allokator in der Lage sein muss, die erforderliche Initialisierung durchzuführen). . Da intes nicht implizit konvertierbar ist, Asollte dieses Programm schlecht geformt sein.
Überraschenderweise scheint es jedoch unter GCC zu kompilieren .