Неуказанное неявное создание объекта - PullRequest
9 голосов
/ 11 марта 2020

Поскольку P0593 Неявное создание объектов для низкоуровневой манипуляции с объектами принято, объекты теперь могут создаваться неявно в C ++ 20.

Специально формулировка, предложенная предложением, позволяет определенным операциям (таким как std::malloc) автоматически создавать и запускать время жизни объектов определенных типов, так называемые типы неявного времени жизни , , если введение таких объектов может привести к тому, что программа с иначе неопределенным поведением будет иметь определенное поведение. См. [intro.object] / 10 .

В проекте теперь говорится, что если существует несколько наборов таких объектов, которые можно было бы создать неявно, чтобы придать программе определенное поведение, это не указано какой из этих наборов создан. (Соответствующее предложение, по-видимому, отсутствует в последней редакции предложения, к которой я мог получить доступ, R5, но в черновике коммита.)

Есть ли на самом деле программа, для которой этот выбор неявно созданного набора объектов наблюдаемый? Другими словами, существует ли программа с определенным, но неуказанным поведением через это новое правило, так что из вывода можно определить, какие наборы типов неявных объектов (из более чем одного возможного) были созданы?

Или это предложение просто предназначено для разъяснения выполнения программы на абстрактной машине (без заметного влияния)?

1 Ответ

9 голосов
/ 11 марта 2020

Давайте возьмем пример в стандарте и немного его изменим:

#include <cstdlib>
struct X { int a, b; };
X *make_x() {
  // The call to std::malloc implicitly creates an object of type X
  // and its subobjects a and b, and returns a pointer to that X object
  // (or an object that is pointer-interconvertible ([basic.compound]) with it),
  // in order to give the subsequent class member access operations
  // defined behavior.
  X *p = (X*)std::malloc(sizeof(struct X) * 2); // me: added the *2
  p->a = 1;
  p->b = 2;
  return p;
}

Раньше был только один набор допустимых объектов, которые можно было неявно создать в этом хранилище - он должен был быть точно один X. Но теперь у нас есть память для двух X с, но только запись в один из них, и ничто в этой программе никогда не затрагивает остальные байты. Таким образом, существует множество различных наборов объектов, которые могут быть созданы неявно - возможно, два X с, может быть X и два int с, может быть X и восемь char с, ...

Нельзя наблюдать, какой набор создан, потому что, если бы были какие-либо реальные наблюдения, это уменьшило бы возможности только тех наборов, которые были действительны. Если мы сделали что-то вроде p[1]->a = 3, то вселенная возможностей рухнет до одной с двумя X s.

Другими словами, множественные наборы неявно созданных объектов возможны только тогда, когда в программе недостаточно наблюдений, чтобы отличить guish их достоверность. Если бы был способ отличить guish, то по определению они не были бы действительными.

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