Обычная идиома - передавать константную ссылку, а не указатель, если ваша функция может принимать временные значения.
#include<iostream>
struct SomeStruct {
int a;
int b;
~SomeStruct() {
std::cout << "SomeStruct destroyed" << std::endl;
}
};
SomeStruct someFn ( int init )
{
SomeStruct ret = { init, init };
return ret;
}
void someFn2 ( SomeStruct* pStruct )
{
std::cout << "someFn2 called" << std::endl;
}
void someFn2 ( const SomeStruct& someStruct )
{
std::cout << "someFn2 called" << std::endl;
}
int main( )
{
someFn2 ( &someFn ( 32 ) ); // warning - taking address of temporary
someFn2 ( someFn ( 32 ) ); // no warning - safe in non-broken compilers
return 0;
}
выходы
someFn2 called
SomeStruct destroyed
someFn2 called
SomeStruct destroyed
IIRC, набор «неразрушенных» компиляторов не включает Visual C ++ 2003 или более раннюю версию.
Примером этой идиомы в stl будет:
string a = "red";
string b = " apple";
string c = a + b;
где конструктор std::string(const std::string&)
вызывается для c
с временным std::string
, возвращаемым из вызова std::string::operator+
.