7

我发现使类不可复制对我的代码质量有很大帮助。最初我使用 boost::noncopyable 进行此操作,但我发现 VC++ 编译器错误不如私有成员有用(双击会导致代码中的错误位置)。

T(T const&);
T& operator=(T const&);

事实上,它提醒我有很多案例是类没有作为参考传递给他们应该有的地方。如此之多,以至于我非常希望即使在只需要复制构造一次的类上也能收到警告。

有没有好的方法来做到这一点?例如,当我真的想复制构造时,我正在考虑将上述两个方法保留为私有并添加一个公共 T(T const&,bool dummy) 构造函数来调用。或者,也可以将上述两种方法公开,并在复制构造时以某种方式激活编译器警告,在我想要的地方抑制警告。

或者也许有更好的方法?

4

4 回答 4

6

不确定它是否正是您想要的,但是如果您标记复制构造函数explicit,则该类不能按值传递或复制初始化,但您可以使用直接初始化复制构造。

您可能希望将赋值运算符保密,也许NonAssignable基数对此有用。

于 2011-07-07T19:17:17.760 回答
2

我认为你自己命名了一个完美的方式。

我只记得我曾经在另一个代码库中玩过的一个巧妙的(?)小技巧:

struct T
{
    friend class SomeClientThatCanConstructT;
    T(T const&);

  private:
     T(T const&);           
};

正如评论中所讨论的,以下内容不会飞

您可能会选择显式名称(如 CopyConstruct)并依赖 RVO 来同样有效:

struct T
{
     inline T CopyConstruct() const     { return *this; }
     inline T& AssignTo(T& dst) const   { return dst = *this; }
     inline T& AssignFrom(const T& src) { return *this = src; }

  private:
     T(T const&);
     T& operator=(T const&);
};

于 2011-07-07T18:59:31.107 回答
0

您可能会默认构造 aT然后添加assign要使用的方法。不过,这似乎并不完全最佳,这表明您可能想要查看您的复制需求。

于 2011-07-07T19:01:01.727 回答
0

我不喜欢限制类型的想法(CopyConstructible这是整个标准库中大量使用的概念),因为它可能被滥用。如果您可以从另一个实例构造对象,则它应该是可复制构造的。它还会分散读者对重要代码的注意力,而没有任何实际用途。

也许由复制构造函数触发的调试模式下的警告或断言真的是您正在寻找的?

于 2011-07-07T22:02:02.420 回答