0

为什么 std 库不使用这些来代替?目前,如果对不可复制对象的复制构造函数进行调用,则错误消息可能有点“神秘”或让从未遇到过的人感到困惑。

第一次收到此错误消息时,我不知道问题出在哪里(我从没想过无法访问的 ctors 的想法),直到我查看课程并看到“不可复制”并最终理解。

将 copy-ctor 设为私有有什么好处?对于 ctor 重载,它在 VS intellisense 中仍然可见。

为什么他们不简单地选择:

public:
someClass(const someClass&) { static_assert(false, "someClass is of non-copyable type. calls to copy constructor are disallowed."); }

如果有人尝试编译他们的代码,他们将看到此错误消息,其中更明确地说明了错误的原因。相比 (const someClass&) 是无法访问的。想象一下,当涉及大量使用模板时,理解这一点会有多困难?

那么,私有复制ctor 与 static_assert 有什么好处?

4

2 回答 2

2
  1. 神秘消息的原因是编译器的问题,而不是 C++,尽管对于 C++ 来说,实现好的消息确实更难。例如,Clang 提供比其他编译器更好的错误消息。

  2. 我不知道为什么 MS 决定在 VS intellisense 中显示私有重载 - 但这绝对不是 С++ 问题,而是 IDE 的问题(或者有一些隐藏的、对我来说未知的感觉)。

  3. static_assert 仅在 C++11 中受支持,它需要更改更多标准规范才能更改错误消息。

  4. 私有构造函数在 C++ 中比自定义 static_asserts 更惯用。

  5. 这个建议甚至没有任何意义。static_assert 将导致编译器错误。总是。是否有人尝试调用复制构造函数。(正如@BenjaminLindley 在评论中指出的那样)

于 2013-06-20T01:52:10.410 回答
2

在 C++11 中有一个更好的方法:

someClass(const someClass&) = delete;

不幸的是,MSVC 还不支持它。

但是,也许有希望

是的,我正忙着为 VS 2013 Preview 准备 STL。我有一个 VCBlog 草稿,其中包含详细的变更日志,我可以在 Build 会议之后发布。

于 2013-06-20T01:53:34.950 回答