[英]Why do std classes not use static_assert on non-copyable types?
为什么std库不使用它们呢? 当前,如果在不可复制的对象上调用复制构造函数,则错误消息可能有点“含糊”,或者使以前从未遇到过的人感到困惑。
第一次收到此错误消息时,我不知道问题出在哪里(我从来没有想到过无法访问的ctor的想法),直到我抬起头来,看到“不可复制”并最终理解为止。
将复制ctor私有化有什么好处? 在VS intellisense中,对于ctor重载,它仍然可见。
他们为什么不简单地选择:
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有什么好处?
隐秘消息的原因是编译器的问题,而不是C ++的问题,尽管对于C ++而言,实现好消息的难度更大。 例如,Clang提供了比其他编译器更好的错误消息。
我不知道为什么MS决定在VS intellisense中显示私有重载-但这绝对不是С++问题,而是IDE问题(或者有一些隐藏的,我不知道的问题)。
static_assert仅在C ++ 11中受支持,并且它需要更改更多标准规范才能更改错误消息。
在C ++中,私有构造函数比自定义static_asserts更惯用。
这个建议甚至没有任何意义。 static_assert将导致编译器错误。 总是。 是否有人试图调用复制构造函数。 (正如@BenjaminLindley在评论中指出的那样)
在C ++ 11中,有一个更好的方法:
someClass(const someClass&) = delete;
不幸的是,MSVC还不支持它。
但是,也许有希望 :
是的,我非常忙于为VS 2013 Preview准备STL。 我有一个VCBlog草案,其中包含详细的变更日志,可以在Build会议之后发布。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.