0
Why universal reference is not moving + template specialization
Refer class below: I have two constructors one for const l value ref of string and one for rvalue ref It works fine but when i use universal reference with forward, it does not move Whats missing here ? I just want to move rvalue ref with just one constructor Once this issue is resolved, how to use template specialization ? I just want universal reference work for string and other types should not be compiled. In other words, it should work for string only https://code.sololearn.com/cmZg02R12wSs/?ref=app
3 Answers
+ 1
Ketan Lalcheta you are getting different results because you haven't initialised "m_str" anywhere when an l-value is passed to constructor and "myString(const string& str)" is called.
universal reference is working correctly as "s" is an l-value and hence the constructor accepting universal argument forwards an l-value reference while initialising "m_str" ( the second allocation is when contents of "str" are "copied" to "m_str" which never happens in the case of two constructors where one of the constructor you created never initialised "m_str")
+ 1
You are missing actual assignment to *m_str* when calling constructor accepting const l-value references "myString(const string& str)". The constructor with universal argument is working correctly for all the provided cases.
As for restricting universal argument to one type ( string in your case ), you can achieve that with default template parameters trickery
https://code.sololearn.com/ctIj5gWeD79N/?ref=app
P.S. I am pretty sure you can also achive this much easily with C++20 "concepts" but sololearn's code playground currently doesn't enable it while compiling.
0
If universal argument is working correctly , then why I am getting different results for case below:
{
string s = "Ketan12345678970";
myString obj(s);
}
Does code output remain same when
1. Two constructor are provided
2. Or only one universal ref constructor is provided