Могу ли я проверить переменные в теле конструктора, которые были установлены в списке инициализации? - PullRequest
3 голосов
/ 27 октября 2019

У меня есть сомнения по поводу того, как работает тело конструктора в случае списков инициализации. Если значение, переданное конструктором, не является допустимым значением и должно быть сгенерировано исключение, правильно ли делать что-то подобное?

Foo(int a_) : a(a_) {
  if (a>0)
    throw std::invalid_argument("positive value!");
};

У меня есть сомнения относительно того, как это оценивается, в случаеболее сложные ситуации.

1 Ответ

3 голосов
/ 27 октября 2019

Согласно cppreference , абсолютно безопасно предполагать, что список инициализатора будет завершен до того, как будет выполнено «тело» конструктора (жирный шрифт элемента 4 - мой):

Порядок инициализаторов членов в списке не имеет значения: фактический порядок инициализации следующий:

  • 1 Если конструктор предназначен для самого производного класса, виртуальные базовые классы инициализируются впорядок, в котором они появляются в порядке обхода слева направо объявлений декларации базового класса (слева направо относится к появлению в списках базовых спецификаторов)
  • 2 Затем инициализируются прямые базовые классыв порядке слева направо, как они появляются в списке базовых спецификаторов этого класса
  • 3 Затем не статические члены данных инициализируются в порядке объявления в определении класса.
  • 4 Наконец, тело конструктора выполняется

Теперь, хотя cppreference не является действительным стендомard, обычно это точно в таких вопросах.

EDIT: черновик стандарта C ++ 14 (§ 12.6.2) (pp. 283-284 из этого PDF) подтверждает то, что cppreference утверждает. (Да, я знаю, что ОП указала C++11 - но я не смог получить ссылку на этот стандарт в Интернете, и я очень сомневаюсь, что стандарт в этом отношении изменился между 11, 14 и 17!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...