#include <iostream>
#include <typeinfo>
using namespace std;
class Class {
};
class Subclass : public Class {
};
template<typename T>
class Template1 {
public:
};
template<typename T>
class Template2 {
public:
template<typename Y>
Template2(Template1<Y>& t1) // requires reference
{
cout<<"Constructor conversion from reference to "<<typeid(t1).name()<<" to "<<typeid(*this).name()<<endl;
}
template<typename Y>
Template2(Template1<Y>&& t1) // uses an rvalue reference (for temp)
// Template2(const Template1<Y>& t1) // works also but assumes t1 is not changed
{
cout<<"Constructor conversion from rvalue ref "<<typeid(t1).name()<<" to "<<typeid(*this).name()<<endl;
}
};
Template2<Class> f1(Template2<Class>&& t2) {
cout<<"f1() will return: ";
return Template1<Subclass>();
}
Template2<Class> f2(Template2<Class> t2) {
cout<<"f2() will return: ";
return Template1<Subclass>();
}
int main() {
cout<<"test1"<<endl;
f1(Template1<Subclass>()); // error C2664: 'Template2<Class> f1(Template2<Class> &)': cannot convert argument 1 from 'Template1<Subclass>' to 'Template2<Class> &'
cout<<endl<<"test2"<<endl;
f2(Template1<Subclass>()); // OK
cout<<endl<<"test3"<<endl;
f1(Template2<Class>(Template1<Subclass>())); // OK
}