4

インラインとマークされた関数内に含まれる式は、いつ「潜在的に評価される」と見なされますか?

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 番目のオプションがありませんか?

4

1 に答える 1