3

次のコード:

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 のバグとして提出する前に、この動作に対するあなたの意見を聞きたいです。

4

1 に答える 1

2

... gcc 5.2.0 を使用して正常に動作します

おそらくhttps://gcc.gnu.org/bugzilla/show_bug.cgi?id=65719

于 2016-03-02T21:09:50.347 に答える