Параметр operator<<
должен быть const
:
template <class C> MyArchive & operator<< (const C & c)
Поскольку std::make_pair
возвращает временный объект, который нельзя связать с неконстантным параметром. Но временный объект может быть связан с параметром const
, так как тогда срок действия временного объекта увеличивается до конца вызываемой функции.
Простая демонстрация:
template<typename T>
void f(T & c) { cout << " non-const parameter" << endl; }
template<typename T>
void f(const T & a) { cout << "const parameter" << endl; }
int main()
{
f(make_pair(10,20.0)); //this calls second function!
}
Выход:
параметр const
Смотрите сами вывод здесь: http://www.ideone.com/16DpT
EDIT:
Конечно, вышеприведенный вывод объясняет только то, что временная привязка связана с функцией с помощью const-параметра. Это не демонстрирует продление жизни. Следующий код демонстрирует продление жизни:
struct A
{
A() { cout << "A is constructed" << endl; }
~A() { cout << "A is destructed" << endl; }
};
template<typename T>
void f(T & c) { cout << " non-const parameter" << endl; }
template<typename T>
void f(const T & a) { cout << "const parameter" << endl; }
int main()
{
f(A()); //passing temporary object!
}
Выход:
А построено
константный параметр
А разрушен
Тот факт, что A is destructed
после того, как функция напечатает const parameter
, демонстрирует, что жизнь А продлевается до конца вызванной функции!
Код на ideone: http://www.ideone.com/2ixA6