class A
{
public:
A()
{
cout << "A()" << endl;
}
A(const A&)
{
cout << "A(const A&)" << endl;
}
A(A&&)
{
cout << "A(A&&)" << endl;
}
A& operator=(const A&)
{
cout << "A(const A&)" << endl;
}
A& operator=(A&&)
{
cout << "A(const A&&)" << endl;
}
~A()
{
cout << "~A()" << endl;
}
};
A&& f_1()
{
A a;
return static_cast<A&&>(a);
}
A f_2()
{
A a;
return static_cast<A&&>(a);
}
int main()
{
cout << "f_1:" << endl;
f_1();
cout << "f_2:" << endl;
f_2();
}
выход:Это хорошая практика, объявляющая функцию BigStruct && foo (...);
f_1:
A()
~A()
f_2:
A()
A(A&&)
~A()
~A()
В примере кода, очевидно, указывает на то, что f_1() является более эффективным, чем F_2().
Итак, мой вопрос:
Если мы всегда объявляем функцию как some_return_type & & F (...); вместо some_return_type f (...); ?
Если ответ на мой вопрос, правда, тогда другой вопрос следующим образом:
Там было много много функций, объявленных в some_return_type е (...); в мире С ++, мы должны изменить их на современную форму?
Вы скомпилировали его с помощью '-Wall'? msgstr "предупреждение: ссылка на локальную переменную 'a' возвращается. Это в определении 'f_1' ... – mfontanini
http://stackoverflow.com/questions/4986673/c11-rvalues-and-move-semantics-confusion – Fanael