C++ 为什么std类不在不可复制的类型上使用静态断言?

C++ 为什么std类不在不可复制的类型上使用静态断言?,c++,copy-constructor,static-assert,C++,Copy Constructor,Static Assert,为什么std库不使用这些呢?当前,如果在不可复制的对象上调用复制构造函数,则错误消息可能有点“神秘”,或者让以前从未遇到过的人感到困惑 当我第一次收到这个错误消息时,我根本不知道问题出在哪里(我从来没有想到过不可访问的构造函数),直到我查找类并看到“不可复制”并最终理解 将副本私有化有什么好处?它在VS intellisense中仍然可以看到,用于执行构造函数重载 为什么他们不干脆选择: public: someClass(const someClass&) { static_asser

为什么std库不使用这些呢?当前,如果在不可复制的对象上调用复制构造函数,则错误消息可能有点“神秘”,或者让以前从未遇到过的人感到困惑

当我第一次收到这个错误消息时,我根本不知道问题出在哪里(我从来没有想到过不可访问的构造函数),直到我查找类并看到“不可复制”并最终理解

将副本私有化有什么好处?它在VS intellisense中仍然可以看到,用于执行构造函数重载

为什么他们不干脆选择:

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提供了更好的错误消息 例如

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

  • 静态断言仅在C++11和it中受支持 需要更改更多的标准规格才能更改 错误消息

  • <> >私人构造在C++中更为惯用 自定义静态断言

  • 这个建议根本没有任何意义。静态_断言将导致编译器错误。总是。无论是否有人尝试调用复制构造函数。(正如@BenjaminLindley在评论中指出的)

  • <> L> >P>消息的原因是编译器的问题,而不是C++,虽然C++实现好消息更难。 例如,与其他编译器相比,Clang提供了更好的错误消息 例如

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

  • 静态断言仅在C++11和it中受支持 需要更改更多的标准规格才能更改 错误消息

  • <> >私人构造在C++中更为惯用 自定义静态断言

  • 这个建议根本没有任何意义。静态_断言将导致编译器错误。总是。无论是否有人尝试调用复制构造函数。(正如@BenjaminLindley在评论中指出的)


  • 在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的一部分。这个建议根本没有任何意义。
    静态断言将导致编译器错误。总是。无论是否有人尝试调用复制构造函数。