我刚刚听完了Scott Meyers关于C++ 0x的软件工程电台播客采访.大多数新功能对我来说都很有意义,我现在对C++ 0x感到兴奋,除了一个.我仍然没有得到移动语义 ......它们究竟是什么?
我一直在研究C++ 11的一些新功能,我注意到的是在声明变量时使用的双符号,例如T&& var.
首先,这只野兽叫什么?我希望谷歌允许我们搜索这样的标点符号.
究竟是什么意思?
乍一看,它似乎是一个双重参考(如C风格的双指针T** var),但我很难想到一个用例.
我的头疼了:我读了很多关于C++ 11x的移动语义的博客,我的大脑变得糊涂了,所以请有人给我一个关于如何使下面的代码有效工作的简短而又甜蜜的指南?给定一个类Foo,我希望能够编写返回Foo不同状态(有时称为源函数)的对象的函数,并尽可能高效地执行此操作.
class Foo {
// Some methods and members
};
Foo getFirstFoo() {
Foo foo;
// Do some things to foo
return foo;
}
Foo getSecondFoo() {
Foo foo;
// Do some different things to foo
return foo;
}
int main() {
Foo f = getFoo();
// use f ...
f = getSecondFoo();
// use f ...
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我不想修改Foo太多,并且想法是允许Foo通过各种非成员源函数创建各种对象,因此添加更多构造函数将缺少这一点.
在C++ 03中,我的选择是将返回的对象包装在一个auto_ptr(一个很大的缺点是收件人代码需要知道处理智能指针),或者交叉我的手指并希望可能发生某种优化(可能是第一行main,第二行则少).C++ 11x似乎通过移动语义提供了更好的东西,但我如何利用这些呢?所以我需要改变对象在源函数中返回的方式,或者添加一些移动构造函数Foo,或者两者兼而有之?