1. ホーム
  2. c++

[解決済み] テンプレートでインラインキーワードを使用することに意味はあるのか?

2022-07-01 11:30:01

質問

テンプレートはヘッダ内で定義され、コンパイラは関数のインライン化が有利かどうかを判断することができますが、これは何か意味があるのでしょうか?最近のコンパイラは関数をインライン化するタイミングをよく分かっていて、そのために inline のヒントを無視していると聞きました。


edit: 私は両方の答えを受け入れたいのですが、これは不可能です。この問題を解決するために、私は セバスチャン・マッハ の回答は最も多くの票を獲得し、形式的に正しいので、私は受け入れます。 パピー コンポーネント10 の答えも、異なる視点から見て正しいものです。

問題はC++のセマンティクスにあり、これは inline キーワードとインラインの場合は厳密ではありません。 セバスチャン・マッハ には、"write inline if you mean it"とありますが、実際に何を意味しているかというと inline は本来の意味から、コンパイラが ODR 違反で文句を言うのをやめさせるための指令に発展したため、明確ではありません。 パピー が言っています。

どのように解決するのですか?

無関係ではありません。また、すべての関数テンプレートが inline になっているわけではありません。標準では、それについてさえも明示的に 明示的な特殊化 ([temp.expl.spec])

以下を持つ。

a.cc

#include "tpl.h"

b.cc

#include "tpl.h"

tpl.h (Explicit Specializationから引用)。

#ifndef TPL_H
#define TPL_H
template<class T> void f(T) {}
template<class T> inline T g(T) {}

template<> inline void f<>(int) {} // OK: inline
template<> int g<>(int) {} // error: not inline
#endif

これをコンパイルすると、出来上がりです。

g++ a.cc b.cc
/tmp/ccfWLeDX.o: In function `int g<int>(int)':
inlinexx2.cc:(.text+0x0): multiple definition of `int g<int>(int)'
/tmp/ccUa4K20.o:inlinexx.cc:(.text+0x0): first defined here
collect2: ld returned 1 exit status

記載しない inline を記述しないと、問題が発生する可能性があります。

というわけで、まとめると : 完全に特化されていない関数テンプレート、すなわち、少なくとも一つの未知の型を運ぶものについては、以下のように省略することができます。 inline を省略してもエラーにはなりませんが、それでも彼らは inline . 完全な特殊化、つまり、既知の型のみを使用するものについては、これを省略することはできません。

経験則の提案 : 書く inline と書いて、一貫性を持たせる。そうすることで、ただできるようになったからといって、するかしないかについて考えることが少なくなるのです。(この経験則は、準拠するのは Vandevoordeの/Josuttisの C++テンプレート。完全ガイド ).