это В абзаце стандартного проекта 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)**
В оставшейся части этого поста я буду ссылаться на «языковую конструкцию, определенную для создания неявного вызова функции» просто как «конструкция».
У меня есть несколько вопросов, связанных с цитируемым пунктом:
Почему этот отрывок («и это не является частью полного выражения«) упоминается? Единственные причины, о которых я могу думать, это:» конструкция » содержащий выражение (истинное выражение, а не определение, использованное в этом параграфе, которое рассматривает «конструкции» как выражения), которое в противном случае будет рассматриваться как полное выражение или «конструкция» содержащий другая «конструкция», которая, аналогично, сама по себе будет рассматриваться как полное выражение. Являются ли эти причины правильными? Если это так, я был бы признателен за несколько конкретных примеров.
Каковы некоторые примеры «конструкций»? Я знаю, что инициализация объекта может быть одна (из-за неявного вызова конструктора), но третья точка абзаца («init-декларатор ([dcl.decl])) явно рассматривает это как полное выражение. Кроме того, используя новый Оператор означает неявный вызов двух функций (одна для выделения пространства, а затем конструктор), но новое выражение это выражение само по себе.
Почему для конструкции: «S s1 (1)» сказано, что полное выражение является вызовом конструктора «S :: S (int)»? Почему полное выражение не является самой конструкцией?
Задача ещё не решена.
Других решений пока нет …