【发布时间】:2015-01-08 04:41:40
【问题描述】:
我有以下代码:
class Game {
private:
const Ruleset& rules;
public:
Game(const Ruleset&);
}
public class Ruleset {
public:
virtual ~Ruleset();
virtual bool isMoveValid(Move&) const = 0;
}
现在以下初始化程序可以正常工作:
Game::Game(const Ruleset& r) : rules(r) {}
但我刚刚发现这并不能保护我免受对临时对象的悬空引用。我想到了以下解决方案:
class Game {
private:
const Ruleset& rules;
public:
Game(const Ruleset&);
Game(const Ruleset&&) = delete;
}
这段代码的问题在于,我在现实中为 Game 有很多不同的构造函数,我想避免专门删除其他所有构造函数,所以我想要类似的东西
class Game {
private:
const Ruleset rules;
public:
Game(const Ruleset&&);
}
Game::Game(const Ruleset& r) : rules(forward(r)) {}
可能带有更多复制/移动的参数。假设我有一个带有 4 个参数的构造函数:
Constructor(type1&, type2&, type3&, type4&).
然后我想尽可能使用 move-constructor,但我不想编写 Constructor(type1&&, type2&, type3&, type4&) 等的每个变体...
这可能吗? (当然现在规则集类必须声明移动构造函数)。还请指出您何时有更好的方法来帮助我有效地编写此类代码。
【问题讨论】:
-
“我想要类似”代码中的构造函数签名不匹配,不清楚您希望它做什么
-
std::forward(r)永远无效,您必须提供模板参数列表。也许您只想要Game(RuleSet r) : rules(std::move(r)) { },如果传递一个左值,它将执行复制和移动,或者如果传递一个右值,则执行两个移动。 -
谢谢乔纳森,我想多了,std::move 在这种情况下应该可以正常工作吗?它是如何工作的,我认为 move 在每种情况下都会将其转换为右值,这如何调用复制构造函数?
-
可以调用复制构造函数来初始化
r,然后rules总是被移动构造函数初始化。 -
等一下,您可以按值存储规则集吗?这改变了问题。
标签: c++ c++11 reference constants move-semantics