C++ 为什么std类不在不可复制的类型上使用静态断言?
为什么std库不使用这些呢?当前,如果在不可复制的对象上调用复制构造函数,则错误消息可能有点“神秘”,或者让以前从未遇到过的人感到困惑 当我第一次收到这个错误消息时,我根本不知道问题出在哪里(我从来没有想到过不可访问的构造函数),直到我查找类并看到“不可复制”并最终理解 将副本私有化有什么好处?它在VS intellisense中仍然可以看到,用于执行构造函数重载 为什么他们不干脆选择:C++ 为什么std类不在不可复制的类型上使用静态断言?,c++,copy-constructor,static-assert,C++,Copy Constructor,Static Assert,为什么std库不使用这些呢?当前,如果在不可复制的对象上调用复制构造函数,则错误消息可能有点“神秘”,或者让以前从未遇到过的人感到困惑 当我第一次收到这个错误消息时,我根本不知道问题出在哪里(我从来没有想到过不可访问的构造函数),直到我查找类并看到“不可复制”并最终理解 将副本私有化有什么好处?它在VS intellisense中仍然可以看到,用于执行构造函数重载 为什么他们不干脆选择: public: someClass(const someClass&) { static_asser
public:
someClass(const someClass&) { static_assert(false, "someClass is of non-copyable type. calls to copy constructor are disallowed."); }
如果有人试图编译他们的代码,他们将看到这个错误消息,它更明确地说明了错误的原因。与(const someClass&)相比,无法访问。想象一下,当大量使用模板时,理解这一点有多困难
那么,与静态断言相比,私有拷贝ctor有什么好处呢
<> L> >P>消息的原因是编译器的问题,而不是C++,虽然C++实现好消息更难。
例如,与其他编译器相比,Clang提供了更好的错误消息
例如
在C++11中,有一种更好的方法:
someClass(const someClass&) = delete;
不幸的是,MSVC还不支持它
但是,也许:
是的,我正忙着准备VS 2013预览版的STL。我已经
我有一个VCBlog草稿,里面有详细的变更记录,我可以
在构建会议之后发布
在C++11中,有一种更好的方法:
someClass(const someClass&) = delete;
不幸的是,MSVC还不支持它
但是,也许:
是的,我正忙着准备VS 2013预览版的STL。我已经
我有一个VCBlog草稿,里面有详细的变更记录,我可以
在构建会议之后发布
自C++11以来,静态_断言可用。std库很可能是用C++03编写的。您希望它如何工作?不管发生什么,该类都不会编译。通过尝试编译类代码而不是调用类代码来检查
静态断言。当提供了没有散列函数的类型时,无序映射也会使用它。该类在我这边编译,只有在我调用复制或赋值时才失败。@David:如果您在模板中使用它,那么它会工作,因为VS。不,unordered\u map
不会执行您正在执行的操作。它不会将false
直接传递到static\u assert
。它传递一个基于键计算的值。std库很可能是用C++03编写的。您希望它如何工作?不管发生什么,该类都不会编译。通过尝试编译类代码而不是调用类代码来检查静态断言。当提供了没有散列函数的类型时,无序映射也会使用它。该类在我这边编译,只有在我调用复制或赋值时才失败。@David:如果您在模板中使用它,那么它会工作,因为VS。不,unordered\u map
不会执行您正在执行的操作。它不会将false
直接传递到static\u assert
。它传递一个基于键计算的值。这里有一个更相关的链接:很公平,对于较旧的库来说,这是有意义的,但是对于线程、未来、打包的任务和承诺,实现一个静态的断言是合理的,因为它们都是c++115的一部分。这个建议根本没有任何意义。静态断言将导致编译器错误。总是。无论是否有人尝试调用复制构造函数。公平地说,对于较旧的库来说,这是有意义的,但是对于线程、未来、打包的_任务和promise,实现静态_断言是合理的,因为它们都是c++115的一部分。这个建议根本没有任何意义。静态断言将导致编译器错误。总是。无论是否有人尝试调用复制构造函数。