インラインとマークされた関数内に含まれる式は、いつ「潜在的に評価される」と見なされますか?
a.cpp
template <typename T>
const T& foo(const T& arg) { return arg; }
inline void dead() {
int x(21);
x = foo(x);
}
b.cpp
#include <iostream>
template <typename T> const T& foo(const T&);
int main(int argc, char *argv[]) {
std::cout << foo(12) << std::endl;
}
$(CCC) -c a.cpp; $(CCC) -c b.cpp; $(CCC) a.o b.o -o bin
インライン関数が定義されるとすぐに式が「潜在的に評価される」と見なされる場合、テンプレートをインスタンス化する必要があり、リンクが正常に行われると予想されます。代わりに、インラインで宣言された関数内の式が、そのような関数自体が ODR で使用されるようになったときにのみ「潜在的に評価される」ようになる$(CCC) -c a.cpp; $(CCC) -c b.cpp; $(CCC) a.o b.o -o bin
場合、リンク ステップで失敗することが予想されます。
これまでのところ、xl C++ 12 (リンクに成功) とさまざまなバージョンの gcc + clang 3.5 (すべてリンクに失敗) をテストしました。
正しい動作はどれですか? ここで 3 番目のオプションがありませんか?