Стандарт C++: почему некоторые "заказы" определены, а некоторые нет?
- Имея класс, порядок инициализации его членов строго определен в конструкторе (возможно, чтобы разрешить зависимости между членами, как в этом вопросе - но я думаю, что это больше проблема проектирования, я могу представить циклические зависимости).
- При вызове функции порядок оценки параметров не определен, я думаю, что это для совместимости с Си.
И у нас есть ошибка для следующей проблемы "страшного алмаза":
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 ответ
Это очень разные ситуации с различными компромиссами. В каждом случае вы должны рассмотреть
- Как часто возникают такие ситуации?
- Насколько вероятен произвольный выбор, чтобы иметь неожиданные последствия?
- Насколько просто явно указать, когда нужен конкретный заказ?
- Какие потери производительности вызваны навязыванием определенного заказа?
Ответы на эти вопросы довольно разные в каждой ситуации, поэтому естественно, что выбор разный.