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 X
ist ein Sequenzcontainer, ist:
T
sollEmplaceConstructible
inX
von sein*i
.
Im vorhergehenden Absatz heißt es jedoch:
i
undj
bezeichnen 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 int
es nicht implizit konvertierbar ist, A
sollte dieses Programm schlecht geformt sein.
Überraschenderweise scheint es jedoch unter GCC zu kompilieren .