C ++ 17 стандартное определение полного выражения

это В абзаце стандартного проекта C ++ 17 говорится, среди прочего, что:

полное выражение является:

-неоцененный операнд,

-константное выражение ([expr.const]),

INIT-описатель ([dcl.decl]) или mem-initializer ([class.base.init]), включая составляющие выражения инициализатора,

-вызов деструктора, сгенерированного в конце срока службы объекта, отличного от временного объекта, или

-выражение, которое не является подвыражением другого выражения и это не является частью полного выражения.

Если языковая конструкция определена для неявного вызова функции, использование языковой конструкции считается выражением для целей этого определения. […]

struct S {

S(int i): I(i) { }       // full-expression is initialization of I

int& v() { return I; }
~S() noexcept(false) { }
private:
int I;
};

S s1(1);                   // **full-expression is call of S​::​S(int)**

В оставшейся части этого поста я буду ссылаться на «языковую конструкцию, определенную для создания неявного вызова функции» просто как «конструкция».

У меня есть несколько вопросов, связанных с цитируемым пунктом:

  1. Почему этот отрывок («и это не является частью полного выражения«) упоминается? Единственные причины, о которых я могу думать, это:» конструкция » содержащий выражение (истинное выражение, а не определение, использованное в этом параграфе, которое рассматривает «конструкции» как выражения), которое в противном случае будет рассматриваться как полное выражение или «конструкция» содержащий другая «конструкция», которая, аналогично, сама по себе будет рассматриваться как полное выражение. Являются ли эти причины правильными? Если это так, я был бы признателен за несколько конкретных примеров.

  2. Каковы некоторые примеры «конструкций»? Я знаю, что инициализация объекта может быть одна (из-за неявного вызова конструктора), но третья точка абзаца («init-декларатор ([dcl.decl])) явно рассматривает это как полное выражение. Кроме того, используя новый Оператор означает неявный вызов двух функций (одна для выделения пространства, а затем конструктор), но новое выражение это выражение само по себе.

  3. Почему для конструкции: «S s1 (1)» сказано, что полное выражение является вызовом конструктора «S :: S (int)»? Почему полное выражение не является самой конструкцией?

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]