Poniższy kod wydaje się działać poprawnie w Clang ++ i GCC:std :: vector na przód zadeklarowanego typu
#include <vector>
class A {
private:
int i;
std::vector<A> children;
public:
A& add();
};
A& A::add() { children.emplace_back(); return children.back(); }
int main() {
A a;
A& a2 = a.add();
}
Gdy człon dane std::vector<A>
deklaruje, A
jest nadal niekompletna typu. To samo, co przy korzystaniu z std::vector<B>
i B
zostało zadeklarowane tylko z wyprzedzeniem z class B;
. Powinien działać z std::vector
, ponieważ zawiera tylko wskaźnik do A
.
Czy to gwarantuje działanie lub niezdefiniowane zachowanie?
Faktycznie, papier przyjęty dla C++ 17 został zaakceptowany tylko z 'std :: list',' std :: forward_list' oraz 'std :: vector', dzięki czemu GCC, Clang i MSVC są zgodne po wyjęciu z pudełka . – Morwenn