【发布时间】:2012-06-26 14:15:18
【问题描述】:
我编写了一个简单的链表,因为最近的一次面试编程挑战向我展示了我的 C++ 已经生锈了。在我的列表中,我声明了一个私有副本构造函数,因为我想明确避免制作任何副本(当然还有懒惰)。当我想按值返回一个拥有我的列表之一的对象时,我遇到了一些麻烦。
class Foo
{
MyList<int> list; // MyList has private copy constructor
public:
Foo() {};
};
class Bar
{
public:
Bar() {};
Foo getFoo()
{
return Foo();
}
};
当我尝试按值返回 Foo 对象时,我收到一个编译器错误,提示 MyList 有一个私有复制构造函数。 Return-Value-Optimization 是否应该否定任何复制的需要?我需要编写一个复制构造函数吗?在我开始寻找这个问题的解决方案之前,我从来没有听说过移动构造函数,这是最好的解决方案吗?如果是这样,我将不得不阅读它们。如果不是,解决这个问题的首选方法是什么?
【问题讨论】:
-
RVO 是一种优化。如果您不允许复制构造,那么您将无法复制构造。如果您确实允许,则可以应用 RVO。
-
优化不应该改变行为,相反,编译器只有在能够保证预期行为的情况下才能进行优化。要通过复制返回,对象必须是可复制的。
-
@lvella:虽然在这种情况下,优化是允许改变行为 - 即使副本有副作用,也可以省略。但是你是正确的,复制构造函数必须是可访问的。
-
@lvella RVO 被允许改变行为。但是没有 RVO 的代码必须是合法的,所以编译器仍然期望找到一个有效的复制构造函数。
标签: c++