#include <iostream>
#include <cstdlib>
#include "A.h"
void second(const A& a)
{
std::cout << "void second(const A& a)." << std::endl;
}
void second(A&& a)
{
std::cout << "void second(A&& a)." << std::endl;
}
void first(const A& a)
{
std::cout << "void first(const A& a)." << std::endl;
second(a);
}
void first(A&& a)
{
std::cout << "void first(A&& a)." << std::endl;
second(a); //Make this call void second(A&& a) without using std::move(a) again?
}
int main()
{
std::cout << "int main()." << std::endl;
A a;
first(std::move(a));
std::cin.sync();
std::cin.get();
return EXIT_SUCCESS;
}
问问题
62 次
3 回答
2
second(a);
它不能调用second(A&&)
,因为它a
是一个左值(因为它有一个name)。
打电话给second(A&&)
你需要一个右值。因此,您需要转换a
为右值,为此您必须使用move
或进行手动显式转换:
second(std::move(a)); //invokes second(A&&)
second(static_cast<A&&>(a)); //invokes second(A&&)
希望有帮助。
于 2013-01-13T20:21:35.430 回答
1
函数内部
void first(A&& a)
该参数a
是一个命名值,因此是一个左值。
无论如何,你真的不希望它在第一次函数调用时被移走,因为如果你想a
在你的函数中多次使用它会造成很多麻烦。考虑
void first(A&& a)
{
second(a);
third(a);
fourth(a);
}
您不希望调用second
将值从a
.
于 2013-01-13T20:24:10.740 回答
1
您是否发现为每个函数编写右值引用重载的过程很乏味,并且正在寻找一种方法来摆脱这种乏味?考虑将您的重载压缩为一个函数,该函数按值获取参数,然后将它们移动到需要去的地方。
所以,换句话说,这两个函数......
void foo(X const& x) {
bar(x);
}
void foo(X&& x) {
bar(std::move(x));
}
...成为这一功能
void foo(X x) {
bar(std::move(x));
}
每个额外参数的节省(在键入和可维护性方面)成倍增加。有时它会花费额外的移动,但从不需要额外的副本(当然,除非没有移动构造函数)。
于 2013-01-13T20:33:55.000 回答