テンプレートはヘッダー内で定義され、コンパイラは関数のインライン化が有利かどうかを判断できるので、それは意味があるのでしょうか? 最近のコンパイラは関数をインライン化するタイミングをよりよく認識しており、inline
ヒントを無視していると聞きました。
編集:両方の回答を受け入れたいのですが、それは不可能です。問題を解決するために、私は受け入れますセバスチャン・マッハの回答は最も多くの票を集めており、正式には正しいのですが、コメントで述べたように、私は子犬'砂コンポーネント 10's の回答も、別の観点から見ると正しいものになります。
問題は C++ のセマンティクスにあり、inline
キーワードとインライン展開の場合は厳密ではありません。セバスチャン・マッハ「本気ならインラインで書きなさい」と書いてあるが、それが実際に何を意味しているのかはinline
明確ではない。なぜなら、この命令は元々の意味から「コンパイラがODR違反について文句を言うのを止める」という命令へと進化したからだ。子犬と語る。
ベストアンサー1
それは無関係ではありません。また、すべての関数テンプレートがinline
デフォルトでそうであるわけではありません。標準では、明示的な特殊化([temp.expl.spec])
以下のものを用意してください。
a.cc
#include "tpl.h"
b.cc
#include "tpl.h"
tpl.h(明示的な特殊化より抜粋):
#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
と、問題が発生する可能性があります。
まとめると: 完全に特殊化されていない関数テンプレート、つまり、少なくとも 1 つの未知の型を持つテンプレートの場合はinline
、 を省略してエラーを受け取ることはありませんが、それでも ではありませんinline
。完全に特殊化されたもの、つまり、既知の型のみを使用するものの場合は、 を省略することはできません。
提案された経験則:inline
書きたいと思ったら、とにかく一貫性を持って書きましょう。書けるから書くか書かないかを考える必要が減ります。(この経験則はヴァンデヴォールド/ジョスティスC++ テンプレート: 完全ガイド)。