Ссылка будет существовать в течение всего времени жизни container
, но объект , на который ссылается , будет существовать только в течение времени жизни этого объекта. В этом случае вы привязали свою ссылку к временному объекту с автоматическим распределением памяти (если хотите, «выделением стека», хотя это не номенклатура C ++). Следовательно, вы не можете ожидать, что временный объект будет существовать за пределами оператора, в котором он был записан (поскольку он выходит из области видимости сразу после вызова конструктора для container
). Лучший способ справиться с этим - использовать копию, а не ссылку. Поскольку вы используете константную ссылку, в любом случае она будет иметь похожую семантику.
Вы должны переопределить свой класс как:
template<typename T>
class container
{
public:
container(const T& first, const T& second) : first(first), second(second) {}
private:
const T first;
const T second;
};
В качестве альтернативы, вы можете дать вашим объектам имя, чтобы они не выходили за рамки:
adaptor first;
adaptor second;
container c(first,second);
Однако я не считаю это хорошей идеей, поскольку такое утверждение, как return c
, недопустимо.
Редактировать
Если ваша цель состоит в том, чтобы обмениваться объектами, чтобы избежать затрат на копирование, тогда вам следует рассмотреть возможность использования объектов с интеллектуальным указателем. Например, мы можем переопределить ваш объект с помощью умных указателей следующим образом:
template<typename T>
class container
{
public:
container(const boost::shared_ptr<const T>& first, const boost::shared_ptr<const T>& second) : first(first), second(second) {}
private:
boost::shared_ptr<const T> first;
boost::shared_ptr<const T> second;
};
Затем вы можете использовать:
boost::shared_ptr<const adaptor> first(new adaptor);
boost::shared_ptr<const adaptor> second(new adaptor);
container<adaptor> c(first,second);
Или, если вы хотите иметь изменяемые копии первой и второй локально:
boost::shared_ptr<adaptor> first(new adaptor);
boost::shared_ptr<adaptor> second(new adaptor);
container<adaptor> c(boost::const_pointer_cast<const adaptor>(first),boost::const_pointer_cast<const adaptor>(second));