【问题标题】:What does "const class" mean?“常量类”是什么意思?
【发布时间】:2008-10-16 00:23:11
【问题描述】:

经过一些查找和替换重构后,我最终得到了这个 gem:

const class A
{
};

“常量类”是什么意思?好像可以编译了。

【问题讨论】:

    标签: c++ class constants


    【解决方案1】:

    const 在那个例子中是没有意义的,你的编译器应该给你一个错误,但是如果你用它来声明那个类的变量在结束 }; 之间,那么定义了这些实例如const,例如:

    
    const class A
    {
    public:
        int x, y;
    }  anInstance = {3, 4};
    
    // The above is equivalent to:
    const A anInstance = {3, 4};
    

    【讨论】:

    • 我找不到理由将其作为错误。编译器可以随意发出警告,但只有标准才能确定什么算作错误。
    • 因为你声明的东西不是 const 。这绝不是您想要做的事情,因此应该是一个错误。标准应该确定什么是正确的;定义每一个错误的东西都是太多的工作。
    • 我认为标准中使用的术语是“错误的”。标准没有说什么是不允许的,只有什么是允许的。这不是有效的 C++ 语法,因此是不允许的。
    • 这是一个错误,因为存储类说明符仅适用于您有声明符并且在此示例中没有声明符的情况。
    • 7.1.5.1/1: "有两个 cv 限定符,const 和 volatile。如果 cv 限定符出现在 decl-specifier-seq 中,则声明的 init-declarator-list 应不能为空。”
    【解决方案2】:

    “const 类”是什么意思?好像可以编译了。

    不适合我。我认为您的编译器只是出于礼貌而忽略了它。

    编辑:是的,VC++ 默默地忽略 const,GCC 抱怨。

    【讨论】:

    • 我要说的是 VC++ 出错的边缘案例
    • 看起来像; 'const' 不会影响我能找到的任何东西。
    • VC++ 确实消化了很多格式错误的代码(我现在使用的是 2013)。他们似乎只是为了快乐的道路而测试它。
    【解决方案3】:

    如果你有这个:

    const class A
    {
    } a;
    

    那么它显然意味着 'a' 是 const。否则,我认为它可能是无效的c++。

    【讨论】:

    • C++ 被遗忘的好功能!我确实记得很久以前你在 C 中做过类似的事情。
    【解决方案4】:

    除非你之后声明一个类的实例,否则没有意义,比如这个例子:

    const // It is a const object...
    class nullptr_t 
    {
      public:
        template<class T>
          operator T*() const // convertible to any type of null non-member pointer...
        { return 0; }
    
        template<class C, class T>
        operator T C::*() const   // or any type of null member pointer...
        { return 0; }
    
      private:
        void operator&() const;  // Can't take address of nullptr
    
    } nullptr = {};
    

    如果您正在等待 C++0x,则可以使用临时的 nullptr 实现。

    【讨论】:

      【解决方案5】:

      尝试用 GCC 编译它,它会给你以下错误:
      error: qualifiers can only be specified for objects and functions.

      从错误中可以看出,只有对象(变量、指​​针、类对象等)和函数可以是常量。所以尝试将对象设为常量,然后它应该可以正常编译。
      const class A {};
      const A a ;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-15
        • 2011-04-02
        • 2012-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多