为什么std类不在不可复制类型上使用static_assert ?
Why do std classes not use static_assert on non-copyable types?
为什么std库不使用这些呢?目前,如果对不可复制对象的复制构造函数进行调用,错误消息可能会有点"神秘"或让以前从未遇到过的人感到困惑。
当我第一次看到这个错误消息时,我不知道问题出在哪里(我从来没有想过不可访问的actor的概念),直到我查了这个类,看到了"non-copyable",我终于明白了。
将复制函数设为私有的好处是什么?在VS智能感知中,它仍然是可见的。
他们为什么不干脆选择:
public:
someClass(const someClass&) { static_assert(false, "someClass is of non-copyable type. calls to copy constructor are disallowed."); }
如果有人试图编译他们的代码,他们将看到这个错误消息,它更明确地说明了错误的原因。compare to (const someClass&)是不可访问的。想象一下,当涉及到大量使用模板时,理解这一点有多困难?
那么,与static_assert相比,私有复制函数有什么好处呢?-
隐藏消息的原因是编译器的问题,而不是c++的问题,尽管在c++中实现好的消息确实比较困难。Clang提供了比其他编译器更好的错误消息的例子。
-
我不知道为什么MS决定显示私有重载VS智能感知-但这绝对不是С++的问题,但IDE的问题(或者有一些隐藏的,未知的我的感觉)。
-
static_assert仅在c++ 11中支持仅仅为了改变就需要改变更多的标准规格吗错误消息。
-
私有构造函数在c++中比自定义static_assert。
-
这个建议根本没有任何意义。static_assert将导致编译器错误。总是这样。是否有人试图调用复制构造函数。(正如@BenjaminLindley在评论中指出的)
在c++ 11中有一个更好的方法:
someClass(const someClass&) = delete;
遗憾的是,MSVC还不支持。
但是,也许还有希望:
是的,我正忙着为VS 2013预览版准备STL。我我得到了一个VCBlog草稿,里面有详细的变更日志,我可以在Build会议之后发布。
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 收到错误"invalid use of non-static data member 'stu::n' "
- LNK1104:无法打开libpjproject-i386-Win32-vc14-Debug-Static.lib
- 我应该在 C++ 中何时/为什么使用 STATIC?
- 在VS2019项目中集成ImageMagick:x64-windows-static library
- 如何在 assert() 和 static_assert() 之间调度,如果在 constexpr 上下文中依赖?
- 如何处理Boost Spirit X3导致Visual Studio 2019 "static initialization order fiasco"?
- 我关于函数"Assert"的C++代码有问题
- "static char __ = []() -> char"的含义
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- 无法在 DLL 中链接 SDL2-static.lib
- 如何摆脱C++中未解析的外部符号"private: static char"错误?
- assert() 在发布模式下充当标识函数吗?
- 如何编写一个接受如下断言消息的自定义断言函数:assert(false) << "assertio
- C++线程"Call to non-static member function without an object argument"
- 出现这种错误的原因是什么"invalid use of non-static data member "
- static是如何使用ClassA::m_variable处理所有类对象的
- LNK2001:未解析的外部符号public:static类std::vector
- static assert - C++ concepts vs static_assert