Clangコンパイラが許可していることを誤って見つけました:
inline class AAA
{
};
c ++で。これは何ですか?
PS。これをClangメーリングリストに報告しました[email protected]
、そして今返信を待っています。私は知らされてこの質問を更新します。
Clangメーリングリストから回答を得ました。それはバグでした: http://llvm.org/bugs/show_bug.cgi?id=3941
ただし、最近のビルドではすでに修正されているようです。とにかくありがとう :)
これが会話です: http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-March/014207.html
クラスの宣言の直後にそのクラスのオブジェクトを返す関数を宣言したい場合に許可されます。次に例を示します。
_#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
の優先順位は重要ではないため、同じです。
それが明確で説得力があることを願っています。
clangはこれを許可すべきではありません。inline
は、ISO/IEC 14882:2003 7.1.2 [dcl.fct.spec]/1の関数の宣言でのみ使用できます。
Function-specifiersは、関数宣言でのみ使用できます。
inline
は、3つの関数指定子のうちの1つで、virtual
とexplicit
は他のものです。
@MatthieuMが注記しているように、C++の次のバージョン(C++ 0x)では、inline
キーワードも名前空間定義で許可されます(inline
への異なるセマンティクスは関数指定子)。