次のコード:
template<typename T>
constexpr T foo { 1.2345 };
template<typename T>
T fun(T x) {
return -foo<T> * x;
}
int main() {
fun(2.0);
}
Linux で gcc バージョン 5.1.0 を使用してコンパイル
g++ gcc-bug.cpp -std=c++14
リンク手順中に次のメッセージが表示されて失敗します。
/tmp/ccuciovi.o: In function `double fun<double>(double)':
gcc-bug.cpp:(.text._Z3funIdET_S0_[_Z3funIdET_S0_]+0xd): undefined reference to `foo<double>'
collect2: error: ld returned 1 exit status
単項マイナス (コードの意味が変わります) を削除すると、リンク エラーが解消されます。先頭にゼロを追加すると (コードの意味は変わりません)、エラーも解消されます。次の 2 つの実装によりfoo
、コンパイルが成功します。
template<typename T>
T fun(T x) {
return foo<T> * x; // different meaning
}
template<typename T>
T fun(T x) {
return 0 - foo<T> * x; // same meaning
}
他のコンパイラではこの動作は見られません。元のコード (単項マイナスを含む) は、clang 3.6.0 と gcc 5.2.0 を使用して正常にコンパイルおよび実行されます。
これを gcc 5.1.0 のバグとして提出する前に、この動作に対するあなたの意見を聞きたいです。