Вы правы, вы не должны возвращать адреса временных переменных, а также вы не должны создавать что-то в функции, а затем возвращать это, ожидая, что вызывающая сторона очистит это (если, конечно, оно не обернуто в нечто такоеas boost::shared_ptr
).
Итак, для типов, не относящихся к POD, вашему классу потребуется временный конструктор копирования (и, возможно, конструктор перемещения, если вы используете C ++ 0x для повышения производительности).).