想象一下,我有一个类,其主要职责是填充数据容器.我想将数据移出这个类.所以我有:
class cCreator
{
public:
void generate()
{
///generate the content of data_ and populate it
....
....
}
//variation 1
std::vector<int>&& getData1()
{
return std::move(data_);
}
//variation 2
std::vector<int> getData2()
{
return std::move(data_);
}
private:
std::vector<int> data_
};
Run Code Online (Sandbox Code Playgroud)
S getData()的变体1和变体2之间有什么区别?当我从函数定义中省略&&时会发生什么变化?
想象一下,我们有一堂课
class cFoo {};
Run Code Online (Sandbox Code Playgroud)
另一个带有cFoo对象的向量,如下所示:
class cContainer
{
public:
const cFoo& getFoo(std::size_t index) const;
private:
std::vector<cFoo> fooList_;
}
const fCoo& cContainer::getfoo(std::size_t index) const
{
if(index < fooList_.size())
return fooList_[index];
else
??????????
};
Run Code Online (Sandbox Code Playgroud)
所以我的问题是"在这种情况下最佳做法是什么?".这是在其他部分代替????之后放的东西.此问题对于返回引用的任何成员函数(无论是否为const)都有效.当我们没有任何东西可以返回时,应该返回什么?
显然返回一个本地临时变量是不可能的.我想到的另一个解决方案是cFoo()在cFoo类定义/实现期间返回最可能定义和初始化的静态实例.
当然,在这种情况下,我们可以避免返回引用,但它可能是性能差的选择(特别是如果我们缺少像move运算符这样的好东西).
我对下面这段代码感到很困惑.
#include <iostream>
class mobject
{
public:
mobject(){ std::cout << "mobject ctor\n"; }
~mobject(){ std::cout << "mobject dtor\n"; }
};
mobject giveme() { return mobject(); }
void func2(const mobject& p) { mobject g = p; }
void func1(const mobject& p) { func2(p); }
int main()
{
func1(giveme());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它给了我以下输出:
mobject ctor mobject dtor mobject dtor
我用gcc 5.4.0和`"g ++ -g temp.cpp"编译了代码.我主要担心的是第二个调用mobjects的析构函数.这看起来是错误的,因为我们第二次打电话给dtor.valgrind告诉我这个没有问题,但我仍感到困惑.