Стандарт 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 просто определяется как слева направо?

0

Решение

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]