Код: Выделить всё
struct C { // #1
// Forward declaration only
struct A; // #2
struct B {
// Pointer declaration is allowed with incomplete type
A* a;
int foo() {
// Member requires complete definition of A
return a->value;
}
};
// Complete definition of A given after B
struct A {
int value;
};
// Members and constructor
A a; B b;
C(int x) : a{x}, b{&a} {}
};
int main() {
C c{42};
return c.b.foo(); // returns 42
}
< /code>
Этот фрагмент успешно компилируется с G ++ и Clang. По -видимому, любой настройка приводит к тому, что этот «вперед смотрящий» ссылается на полное определение struct a Это не теоретическая проблема: открытая библиотека планирования движения, важная библиотека робототехники, использует этот шаблон в нескольких местах для определения компараторов для приоритета. (Поиск репо для MotionCompare , чтобы увидеть более полные примеры).
Итак, вопрос: Почему эта компиляция? Изменилась ли обоснованность этой конструкции по мере развития языкового стандарта?
Подробнее здесь: https://stackoverflow.com/questions/797 ... forward-de
Мобильная версия