Стандарт C++: почему некоторые "заказы" определены, а некоторые нет?

  1. Имея класс, порядок инициализации его членов строго определен в конструкторе (возможно, чтобы разрешить зависимости между членами, как в этом вопросе - но я думаю, что это больше проблема проектирования, я могу представить циклические зависимости).
  2. При вызове функции порядок оценки параметров не определен, я думаю, что это для совместимости с Си.
  3. И у нас есть ошибка для следующей проблемы "страшного алмаза":

    struct A {virtual void Print() {}};
    struct B: virtual public A {virtual void Print() {}};
    struct C: virtual public A {virtual void Print() {}};
    struct D: public B, public C {};
    

    Компилятор не знает, какую версию выбрать, порядок определяется как неоднозначный. Почему бы просто не использовать "порядок разрешения первой глубины слева направо", как это определено в этом вопросе (с неубедительным ответом), а именно выбирать B вместо C?

Так почему эти разные подходы? Почему строгий порядок на 1, а не на 3? Разве не проще было оставить 1 неопределенным? Или 2 просто определяется как слева направо?

1 ответ

Это очень разные ситуации с различными компромиссами. В каждом случае вы должны рассмотреть

  • Как часто возникают такие ситуации?
  • Насколько вероятен произвольный выбор, чтобы иметь неожиданные последствия?
  • Насколько просто явно указать, когда нужен конкретный заказ?
  • Какие потери производительности вызваны навязыванием определенного заказа?

Ответы на эти вопросы довольно разные в каждой ситуации, поэтому естественно, что выбор разный.

Другие вопросы по тегам