3

-Oxでコンパイルされたコードは正常にコンパイルされるという奇妙な問題がありますが、でコンパイルされたコードは-gリンクで次のエラーで失敗します。

Undefined symbols for architecture x86_64:
  "stupid<dummy>::t", referenced from:
      stupid<dummy>::operator()(int, int) const in main.o

この問題を再現するコード:

struct dummy { void operator()(const int a, const int b) const {} ; };

template <typename  T>
struct stupid {
 constexpr static T t = T(); // create a new one;

 stupid() {};
 void operator()(int a, int b) const { t(a, b); }
};


int main()
{
 const stupid<dummy> a;
 a( 1, 2 );
}

コードが最適化されている場合、関数はインライン化されており、外部関数呼び出しは要求されていないようですが、コードが最適化されていない場合、関数は呼び出されますが、ありませんか? (なぜ無いのかは不明ですが…)。これは、g++ 4.7 および 4.8、clang 3.2 で発生します。

何か案は?

4

1 に答える 1