由于右值引用而对函数进行双重定义
double definition of function because of rvalue reference
所以我的问题是这样的:
我的 .h 中有什么
class PlayerClass
{
//Class declaration
//...
std::vector<sf::ConvexShape> parts;
void addShape(sf::ConvexShape& sShape);
void addShape(sf::ConvexShape&& sShape);
};
我.cpp里有什么
void PlayerClass::addShape(sf::ConvexShape& sShape)
{
//processing
//...
parts.push_back(sShape);
}
void PlayerClass::addShape(sf::ConvexShape&& sShape)
{
//processing
//...
parts.push_back(sShape);
}
此时,我必须复制粘贴我PlayerClass::addShape
定义中的内容,并重载右值引用 我希望我只需要在我的向量中复制元素,因此不需要引用,但std::Vector::push_back
被定义为通过引用获取参数,请参阅:http://www.cplusplus.com/reference/vector/vector/push_back/
所以这就是困扰我的原因,我总是必须双重复制我的函数以符合引用参数行为(在这种情况下std::Vector::push_back
)
我不能使用const aClass&
因为如果我使用临时对象来调用我的函数,我的向量的迭代器会指向已删除的内容
如果sf::ConvexShape
是廉价的,只需通过复制提供单个重载:
void PlayerClass::addShape(sf::ConvexShape sShape)
{
//processing
//...
parts.push_back(std::move(sShape));
}
这很好地涵盖了所有情况,开销可以忽略不计:
- 从函数内部到向量,您只需支付一个动作;
- 如果调用方正在向你传递一个它仍然感兴趣的对象,他将按原样传递它,因此它将被复制 - 但只有一次,这是你无论如何都会做的复制,把它放到向量中;
- 如果调用者递给你一个他无论如何都不需要的物体,他会做
addShape(std::move(sShape))
,只需支付两步。
相反,如果你有一个左值和一个右值引用重载,即使在移动周围你也可能非常便宜(在上面的情况下,你可以避免一次移动),但在 99% 的情况下,这只是一个无用的复杂性,导致代码重复,因为无论如何移动都应该几乎是免费的。
在大多数处理可移动类型的代码中,如果您最终想要拥有副本,则参数是正确的 - 理想情况下,您不希望在移动构造函数之外看到右值引用参数。
相关文章:
- 在命名空间中定义函数还是限定函数
- 为什么在定义函数之前先声明它
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- 这个c++代码是如何在没有定义函数的情况下运行的
- 具有外部"c"和程序集的未定义函数
- 已定义函数时出现 G++ "未定义的引用"错误
- 将自定义函数传递到基抽象类中以延迟执行
- C++使用 rand 定义函数语法
- Arduino:在 loop() 和自定义函数中运行相同的代码时出现问题
- 将具有固定签名的自定义函数名称注入 CRTP
- 使用定义函数模板别名
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- 在内联程序集中定义函数和从 C++ 调用时出现问题
- 在 Metal 着色器代码中,如何定义函数的 in/out 参数变量?
- 声明和定义函数静态会产生"undefined reference to function_name()"
- 朋友定义函数的名称空间是什么
- 介子 对用户定义函数的未定义引用
- 如何使用 "using" 关键字定义函数原型/签名
- 在 C 结构中定义C++函数