Какой смысл во временной привязке к выражению времени жизни члена в C++ Standard?

В этом вопросе пользователь Happy Mittal цитирует раздел 12.2.5 стандарта C++03: временная привязка к элементу ссылки в ctor-initializer конструктора (12.6.2) сохраняется до выхода из конструктора.

Как это может быть полезно в любом случае? Я имею в виду, что после выхода из конструктора временный объект уничтожается, но ссылка остается связанной - теперь уже уничтоженный объект.

Какой смысл так тщательно указывать временное время жизни, если до сих пор существует свисающая ссылка на все время жизни внешнего объекта? В каком сценарии это поведение может быть полезным?

3 ответа

Решение

Бесполезно привязывать элемент ссылки к мертвому объекту, но полезно понимать, что в этом случае "нормальное" временное продление срока службы при привязке к ссылке не применяется.

Он также указывает временное продление времени жизни, которое применяется в инициализаторе ctor: оно распространяется до конца ctor, а не умирает до выполнения тела ctor. Это было бы бесполезно, кроме как в "умных" классах, в которых весь смысл заключается в выполнении ctor, и этот тип использования (ab) справедливо избегается.

Я не знаю реальных примеров последних, но мне кажется, что деструкторы не по умолчанию сломали классы, которые были "умными" в своей жизни и как они использовались. Это использовалось в реальных условиях и обсуждалось, как обрабатывать семантику dtors по умолчанию в C++0x.

На языке D процесс конструирования может быть написан свободно в некоторой степени. Однако в C++ порядок построения / инициализации строго оговорен. Поэтому, если для инициализации класса требуются дорогостоящие вычисления, код, подобный следующему, иногда может быть допустимым в качестве неохотного обходного пути.

struct S {
  Args const &r;
  A a;
  B b;
  S( args.... )
    : r( expensive_func( args.... ) ), a( r.for_a ), b( r.for_b ) {}
};

Это полезно для авторов компиляторов. У них уже есть логика для уничтожения связанных временных объектов в конце области, и выход конструктора - одна из таких точек. С этим правилом компиляторы могут повторно использовать эту точку, чтобы уничтожить и такие временные.

Обратите внимание, что стандарт действительно должен принять решение о некотором сроке службы, и единственный разумный момент будет после списка инициализатора ctor, но перед телом ctor. Это не та точка, где временные уничтожители будут уничтожены в противном случае, и это может помешать работе области видимости. try {} catch() блоки (которые включают список инициализатора ctor)

Другие вопросы по тегам