web-dev-qa-db-ja.com

C ++インラインクラスとは何ですか?

Clangコンパイラが許可していることを誤って見つけました:

inline class AAA
{
};

c ++で。これは何ですか?


PS。これをClangメーリングリストに報告しました[email protected]、そして今返信を待っています。私は知らされてこの質問を更新します。

36
Eonil

Clangメーリングリストから回答を得ました。それはバグでした: http://llvm.org/bugs/show_bug.cgi?id=3941

ただし、最近のビルドではすでに修正されているようです。とにかくありがとう :)

これが会話です: http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-March/014207.html

9
Eonil

クラスの宣言の直後にそのクラスのオブジェクトを返す関数を宣言したい場合に許可されます。次に例を示します。

_#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;
}
_

また、A()の代わりに変数を宣言するなど、他の不正なケースで表示されるコンパイラエラー(または警告)に注意する必要があります。また、コンパイラがinlineキーワードを無視することを示していることにも注意してください。関数を宣言しなかった場合。

お役に立てば幸いです。

編集:Eonilのコメント用

上の質問のコードについて話している場合、それは私が見ているのと同じケースであり、コンパイラーは警告を出します:_'inline ' : ignored on left of 'AAA' when no variable is declared_

ただし、私の回答でコードを使用していて、A()を変数Bなどに置き換えると、コンパイラエラーが発生します:_'B' : 'inline' not permitted on data declarations_

したがって、コンパイラがそのような宣言を受け入れることを間違えなかったことがわかります。_inline double;_を自分で書いてみませんか?警告が生成されます:_'inline ' : ignored on left of 'double' when no variable is declared_

では、この宣言についてはどうですか。

_double inline d()
{
}
_

警告やエラーは発生しません。次とまったく同じです。

_inline double d()
{
}
_

であるため、inlineの優先順位はまったく重要ではありません。

最初のコード(回答全体)は、次のように記述します。

_class AAA
{
    // Code
};

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

これは合法です。

そして、他の方法では、それは次のように書くことができます:

_class AAA
{
    // Code
};

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

次のように書かれた最初のコード(全体の答え)が表示されれば、安心します。

_#include <iostream>

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

ただし、inlineの優先順位は重要ではないため、同じです。

それが明確で説得力があることを願っています。

40
Tamer Shlash

clangはこれを許可すべきではありません。inlineは、ISO/IEC 14882:2003 7.1.2 [dcl.fct.spec]/1の関数の宣言でのみ使用できます。

Function-specifiersは、関数宣言でのみ使用できます。

inlineは、3つの関数指定子のうちの1つで、virtualexplicitは他のものです。

@MatthieuMが注記しているように、C++の次のバージョン(C++ 0x)では、inlineキーワードも名前空間定義で許可されます(inlineへの異なるセマンティクスは関数指定子)。

15
CB Bailey