- Имея класс, порядок инициализации его членов сильно определен в конструкторе (возможно, чтобы разрешить зависимости между членами, как в этом question, - но я думаю, что это скорее проблема дизайна, я могу представить круговые зависимости).
- Имея вызов функции, порядок оценки параметров не определен, я думаю, что это для совместимости с C.
И у нас есть ошибка для следующей задачи «страшились алмаз»:C++ standard: почему некоторые «заказы» определены, а некоторые нет?
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 {};
компилятор не знает, какой вариант выбрать, порядок определяется как неоднозначные. Почему просто не использовать «порядок разрешения первого порядка влево-вправо», как определено в этом question (с неубедительным ответом), а именно: выбрать B над C?
Итак, почему эти разные подходы? Почему существует строгий порядок для 1, а не для 3? Не проще было оставить 1 неопределенным? Или 2 просто определяется как слева-на-rigth?
Проблема с попыткой доступа к члену с тем же именем из разных баз хорошо определена как неоднозначная. Это существенно отличается от порядка оценки аргументов функции, определяемых реализацией. –
В C++ есть много вещей, которые определены как неоднозначные, чтобы избежать ошибок. –
Ну, неуказанный порядок оценки аргументов открывает некоторые возможности оптимизации. – ScarletAmaranth