繁体   English   中英

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

[英]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有什么好处?

  1. 隐秘消息的原因是编译器的问题,而不是C ++的问题,尽管对于C ++而言,实现好消息的难度更大。 例如,Clang提供了比其他编译器更好的错误消息。

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

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

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

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

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

someClass(const someClass&) = delete;

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

但是,也许有希望

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM