همون طور که خودتون هم گفتید برای کپی نشدن مورد اول باید move constructor نوشت
برای مورد دوم باید ۲ تا overload برای تابع sort بنویسید :
A sort()const& ;
A sort()&&;
مورد دوم برای زمان هایی که متغیر موقت میفرستین استفاده میشه مثل مثالی که شما زدید
پس در مجموع باید به شکل زیر بنویسید : (اجرا در ideone )
#include <iostream>
#include <vector>
#include <algorithm>
class A
{
public:
A(std::initializer_list<int> data) :data_(data){}
A(const std::vector<int>& data) :data_(data){}
A(std::vector<int>&& data) :data_(std::move(data)){};
A sort()const&
{
A cpy(*this); // make a copy
std::sort(cpy.data_.begin(), cpy.data_.end()); // sort the copy
return cpy;
}
A sort()&&
{
std::sort(data_.begin(), data_.end());
return *this;
}
void print()
{
for (auto i : data_){
std::cout << i << '\n';
}
}
private:
std::vector<int> data_;
};
std::vector<int> factory()
{
std::vector<int> a = {5,3,4, 1, 2, 3 };
//do some operations
//return huge vector!
return a;
}
int main()
{
A(factory()).sort().print();
}