2014-01-04 7 views
0
  1. Имея класс, порядок инициализации его членов сильно определен в конструкторе (возможно, чтобы разрешить зависимости между членами, как в этом question, - но я думаю, что это скорее проблема дизайна, я могу представить круговые зависимости).
  2. Имея вызов функции, порядок оценки параметров не определен, я думаю, что это для совместимости с C.
  3. И у нас есть ошибка для следующей задачи «страшились алмаз»: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?

+0

Проблема с попыткой доступа к члену с тем же именем из разных баз хорошо определена как неоднозначная. Это существенно отличается от порядка оценки аргументов функции, определяемых реализацией. –

+1

В C++ есть много вещей, которые определены как неоднозначные, чтобы избежать ошибок. –

+0

Ну, неуказанный порядок оценки аргументов открывает некоторые возможности оптимизации. – ScarletAmaranth

ответ

1

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

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

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

+0

Прошу прощения, но это философия. Я считаю, что люди (только Страуструп в 80-х годах?) решение этих вопросов имело более простые аргументы в пользу того, что они делали, и у них не было значений для таких вопросов, как производительность, частота появления и т. д. – Liviu

+0

Это не имеет большого значения, но для меня самое «естественное» во всем три случая состоят в том, чтобы иметь порядок слева направо ... за исключением арабов и евреев. (Порядок инициализации в конструкторе слева направо) – Liviu

+0

@ Liviu: Ну, вы ошибаетесь. И это отличный, точный ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^