Порядок оценки нового выражения?

используйте эту директиву ng2-tooltip , это очень легко реализовать в вашем приложении

stackblitz: пример

7
задан 15 March 2009 в 19:27
поделиться

5 ответов

Из моей копии n2798:

5.3.4 Новый

21, Вызвана ли функция выделения прежде, чем оценить аргументы конструктора или после оценки аргументов конструктора, но прежде, чем ввести конструктора, является неуказанным. Это является также неуказанным, оценены ли аргументы конструктору, если функция выделения возвращает нулевого указателя или выходы с помощью исключения.

Читайте в сочетании с (для предотвращения неоднозначностей):

5.3.4 Новый

8 Новое выражение получает устройство хранения данных для объекта путем вызывания функции выделения (3.7.4.1). Если newexpression завершается путем выдачи исключения, он может выпустить устройство хранения данных путем вызывания функции освобождения (3.7.4.2). Если выделенный тип является нетипом массива, имя функции выделения является новым оператором, и имя функции освобождения является оператором, удаляют. Если выделенный тип является типом массива, имя функции выделения является оператором, новым [], и имя функции освобождения является оператором, удаляют []. [...]

Это в значительной степени отвечает на вопрос. Ответ является 'Нет'.

12
ответ дан 6 December 2019 в 09:22
поделиться

В целом компилятор C++ является бесплатным переупорядочить параметры функции, пока он не изменяет значение.

См. ответ Martin здесь: Каковы все общие неопределенные поведения, о которых должен знать программист на C++?

Существует на самом деле 2 вызова функции, продолжающиеся здесь под капотом.

  1. новый оператор
  2. вызов конструктора для X

Даже при том, что это - два отдельных вызова, я не полагаю, что между этими двумя операциями существует точка последовательности. Википедия, кажется, поддерживает эту точку. Поэтому Компилятор является бесплатным переупорядочить оценку, как это считает целесообразным.

4
ответ дан 6 December 2019 в 09:22
поделиться

Одним словом, нет.

Нет никакой точки последовательности между "новым" и "++ я"

2
ответ дан 6 December 2019 в 09:22
поделиться

++ я должен быть выполнен перед выделением И вызовом.

Править: (и я, возможно, ответил на немного слишком быстро),

1
ответ дан 6 December 2019 в 09:22
поделиться

новый X( ++ i)

Синтаксис для нового оператора wrt стандарт C++:

[::] "новый" [" (" список выражений")"] {новый идентификатор типа |" (" идентификатор типа")"} [" (" список выражений")"]

Так,

  1. Выделяет память для объекта X.
  2. Список выражений будет оцененный, чтобы быть переданным в конструктора выделенного объекта.

таким образом мы можем уверенный, что, ++ я буду оценен, прежде чем конструктор Object X вызывается.

Удачи..

1
ответ дан 6 December 2019 в 09:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: