2

次の意味は何ですか?

ISO/IEC 14882:2011

7.1.2 関数指定子 [dcl.fct.spec] ...
3 ... インライン指定子は、ブロック スコープの関数宣言には現れません。

この引用によると、このようなものは無効ですか?

#include <iostream>

int main()
{
    inline void foo();
    foo();
}

void foo()
{
    std::cout << "::foo() \n";
}

gcc はエラーなしでコンパイルします。

私は間違っていますか?

4

2 に答える 2

3

この引用によると、このようなものは無効ですか?

はい、質問のテキストで引用した標準段落のため、無効です。

コンパイラがそれを受け入れるという事実は、バグまたは文書化された拡張機能のいずれかである可能性がありますが、C++11 標準に準拠していないことは間違いありません。

追加情報:

上記のプログラムを GCC 4.7.2 でコンパイルしようとすると、次のような警告が表示されます。

警告:グローバル スコープ外で宣言された'inline'関数の指定子は無効です[ ]'foo'-pedantic

于 2013-05-13T21:03:52.917 に答える
0

gccここで自分自身をだましていると思います。これは違法であるべきです。ここで起こっていることは、そのシンボル テーブルにgcc追加され、それが undefined と見なされることです。したがって、呼び出しは、関係する限り未定義にする必要があります。inline void foo();foo();

ただし、リンカー ( ld) が後でコードをリンクしようとすると、foo到達可能なグローバル スコープ内の の定義が検出され、代わりにそれが使用されます。

于 2013-05-13T21:04:21.147 に答える