为什么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有什么好处?
答案 0 :(得分:2)
隐藏消息的原因是编译器的问题,而不是C ++,尽管对C ++来说实现好的消息确实更难。 Clang提供了比其他编译器更好的错误消息 例。
我不知道为什么MS决定显示私有超载 VS intellisense - 但这肯定不是С++问题但是 IDE的问题(或者有一些隐藏的,我不知道的感觉)。
仅在C ++ 11及其中支持static_assert 需要更改更多的标准规格才能改变 错误信息。
私有构造函数在C ++中比在 自定义static_asserts。
这个建议甚至没有任何意义。 static_assert将导致编译器错误。总是。是否有人试图调用复制构造函数。 (正如@BenjaminLindley在评论中指出的那样)
答案 1 :(得分:2)
在C ++ 11中有更好的方法:
someClass(const someClass&) = delete;
不幸的是,MSVC尚不支持它。
但是,也许there is hope:
是的,我非常忙于让STL为VS 2013预览做好准备。我有 得到了VCBlog草案,其中包含了我将能够提供的详细更改日志 在Build会议之后发布。