[解決済み] テンプレートでインラインキーワードを使用することに意味はあるのか?
質問
テンプレートはヘッダ内で定義され、コンパイラは関数のインライン化が有利かどうかを判断することができますが、これは何か意味があるのでしょうか?最近のコンパイラは関数をインライン化するタイミングをよく分かっていて、そのために
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++テンプレート。完全ガイド
).
関連
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] 型名の後の括弧は、newで違いがあるのでしょうか?
-
[解決済み] 関数/メソッドのキーワード 'inline' はいつ書けばよいのですか?
-
[解決済み] mutable' キーワードには、const 関数で変数を変更できるようにする以外の目的があるのでしょうか?
-
[解決済み】関数内の静的constexpr変数は意味があるのでしょうか?
-
[解決済み】インライン関数を使用する場合と使用しない場合とは?
-
[解決済み] インライン仮想関数は本当に無意味なのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] 関数/メソッドのキーワード 'inline' はいつ書けばよいのですか?