Вы должны стараться не использовать new
, для начала, так как его использование приносит проблемы с управлением памятью.
Для вашего примера, просто сделайте следующее:
int main(int, char*[])
{
SomeObject myObject;
// two phases
ParamClass foo(...);
myObject.myMethod(foo);
// one phase
myObject.myMethod(ParamClass(...));
return 0;
}
Я рекомендую первый метод (в два раза), потому что со вторым есть тонкие ошибки.
РЕДАКТИРОВАТЬ : комментарии не совсем подходят для описания ошибок, на которые я ссылался.
Как указывалось @Fred Nurk
, в стандарте говорится о некоторых временах жизни временных:
[class.tevent]
(3Временные объекты уничтожаются как последний шаг в оценке полного выражения (1.9), которое (лексически) содержит точку, где они были созданы.Это верно, даже если эта оценка заканчивается выдачей исключения.Вычисления значений и побочные эффекты уничтожения временного объекта связаны только с полным выражением, а не с каким-либо конкретным подвыражением.
(5) Временное, к которому привязана ссылка, или временное, которое является полнымобъект подобъекта, к которому привязана ссылка, сохраняется в течение всего времени существования ссылки [примечание: за исключением ряда случаев ...]
(5) [например, ...] временная привязка кссылочный параметр в вызове функции (5.2.2) сохраняется до завершения полного выражения, содержащего вызов.
Это может привести к двум тонким ошибкам, которые большинство компиляторов не улавливают:
Type const& bound_bug()
{
Type const& t = Type(); // binds Type() to t, lifetime extended to that of t
return t;
} // t is destroyed, we've returned a reference to an object that does not exist
Type const& forwarder(Type const& t) { return t; }
void full_expression_bug()
{
T const& screwed = forwarder(T()); // T() lifetime ends with `;`
screwed.method(); // we are using a reference to ????
}
Argyrios исправил Clang по моей просьбе, чтобы он обнаружил первый случай (и еще несколько, о которых я изначально не думал).Однако второе может быть очень трудно оценить, если реализация forwarder
не встроена.