-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 で発生します。
何か案は?