为什么std类不在非可复制类型上使用static_assert?

时间:2013-06-20 01:45:53

标签: c++ copy-constructor static-assert

为什么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&)是不可访问的。想象一下,如果涉及大量使用模板,理解这一点会有多困难?

那么,私有copy-ctor与static_assert有什么好处?

2 个答案:

答案 0 :(得分:2)

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

  2. 我不知道为什么MS决定显示私有超载 VS intellisense - 但这肯定不是С++问题但是 IDE的问题(或者有一些隐藏的,我不知道的感觉)。

  3. 仅在C ++ 11及其中支持static_assert 需要更改更多的标准规格才能改变 错误信息。

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

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

答案 1 :(得分:2)

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

someClass(const someClass&) = delete;

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

但是,也许there is hope

  

是的,我非常忙于让STL为VS 2013预览做好准备。我有   得到了VCBlog草案,其中包含了我将能够提供的详细更改日志   在Build会议之后发布。