18

規格は、

inline void foo();

これfooは、外部リンケージを持つインライン関数です(デフォルトでは、すべての関数宣言に外部リンケージがあるため)。これは奇妙なことに私を襲います。1つの定義ルールセクション3.2(C++03とC++11の両方)は次のように述べているためです。

3 ...インライン関数は、それが使用されるすべての変換単位で定義されるものとします。

5 a[n]の定義は複数存在する可能性があります...外部リンケージを使用したインライン関数(7.1.2)...複数の変換単位で定義されたDという名前のエンティティが与えられた場合...Dの各定義はトークンの同じシーケンスで構成されます

これは、インライン関数にも内部リンケージがある可能性があることを意味します。これは、外部リンケージを介して(つまり、変換ユニット間で)関数を使用すると、未定義の動作(段落3による)が呼び出され、その内容がすべての変換ユニットのインライン関数は同じである必要があります。

このルールには、下位互換性または特定のツールチェーンの理由がありますか?

4

2 に答える 2

18

その決定の結果の1つは、インライン関数内で定義された静的変数が、関数のすべてのインスタンス化間で共有されることです。デフォルトが内部リンケージだった場合、各変換ユニットは静的変数の独自のコピーを取得します。それは人々が物事が機能することを期待する方法ではありません-インライン対非インラインはコードセマンティクスにそれほど劇的に影響を与えるべきではありません。

于 2012-02-16T04:38:27.920 に答える
9

これは、JonathanSchillingの記事「ExternInlinesByDefault 」によって適切に回答されています。

この変更の動機について彼を引用するには:

この変更の直接の動機は、同じ会議で採用された新しいテンプレートコンパイルモデルの必要性でした。しかし、より一般的には、デフォルトの変更はその時が来たアイデアであると感じられ、変更はANSIとISOの両方で満場一致で承認されました。

于 2012-02-16T04:33:13.270 に答える