What's the c++ inline class?

前端 未结 3 927
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-31 15:41

I accidentally found that the Clang compiler allows :

inline class AAA
{
};

in C++. What\'s this?


PS. I reported this to Clang ma

相关标签:
3条回答
  • 2021-01-31 15:50

    I got an answer from Clang mailing list. It was a bug: http://llvm.org/bugs/show_bug.cgi?id=3941

    However it looks already been fixed in recent build. Thanks anyway :)

    Here's the conversation: http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-March/014207.html

    0 讨论(0)
  • 2021-01-31 15:55

    clang shouldn't allow this, inline can only be used in the declaration of functions, from ISO/IEC 14882:2003 7.1.2 [dcl.fct.spec] / 1 :

    Function-specifiers can be used only in function declarations.

    inline is one of three function-specifiers, virtual and explicit being the others.

    As @MatthieuM notes, in the next version of C++ (C++0x), the inline keyword will also be allowed in namespace definitions (with different semantics to inline as a function-specifier).

    0 讨论(0)
  • 2021-01-31 16:10

    It's allowed in case you wish to declare a function that returns an object of that class directly after the class' declaration, for example :

    #include <iostream>
    
    inline class AAA 
    {
    public:
        AAA()
        {
            // Nothing
        }
    
        AAA(const AAA& _Param)
        {
            std::cout << "Calling Copy Constructor of AAA\n";
        }
    }A()
     {
         AAA a;
         return a;
     };
    
    int main()
    {
        A();
        return 0;
    }
    

    Also you should notice the compiler errors (or warnings) that appear in other illegal cases, such as declaring a variable instead of A(), also notice that the compiler states that it ignores the inline keyword if you didn't declare any function.

    Hope that's helpful.

    Edit : For The comment of Eonil

    If you are talking about your code above in the question, then it's the same case as I see, the compiler will give you a warning : 'inline ' : ignored on left of 'AAA' when no variable is declared

    However, if you use the code in my answer but replace A() with a variable, B for example, it will generate a compiler error : 'B' : 'inline' not permitted on data declarations

    So we find that the compiler made no mistake with accepting such declarations, how about trying to write inline double; on its own? It will generate a warning : 'inline ' : ignored on left of 'double' when no variable is declared

    Now how about this declaration :

    double inline d()
    {
    }
    

    It gives no warnings or errors, it's exactly the same as :

    inline double d()
    {
    }
    

    since the precedence of inline is not important at all.

    The first code (in the whole answer) is similar to writing :

    class AAA
    {
        // Code
    };
    
    inline class AAA A()
    {
        // Code
    }
    

    which is legal.

    And, in other way, it can be written as :

    class AAA
    {
        // Code
    };
    
    class AAA inline A()
    {
        // Code
    }
    

    You would be relieved if you see the first code (in the whole answer) written like :

    #include <iostream>
    
    class AAA 
    {
        // Code
    } inline A()
     {
        // Code
     };
    

    But they are the same, since there is no importance for the precedence of inline.

    Hope it's clear and convincing.

    0 讨论(0)
提交回复
热议问题