Sprout
Sprout copied to clipboard
sprout::enabler の定義が無い
sprout::enabler_if
を使用する場合は以下のような感じになるので、sprout::enabler
は ODR-used になると思うのですが、sprout::enabler
は GCC や clang では定義されません。
#include <sprout/type_traits/enabler_if.hpp>
template<sprout::enabler_if_t<true> = sprout::enabler>
void f() {}
int main()
{
f();
}
ODR-used のオブジェクトが定義されていないと ill-formed になるので(ただし、no diagnostic required)、GCC や clang であっても定義すべきと思うのですが、いかがでしょうか。 ちなみに、現状 GCC では意図したとおりに動作するようですが、clang では -g オプションをつけるとリンクエラーになります。 http://melpon.org/wandbox/permlink/5ZIS1xVQL1pM4zQW
こうした使用では enabler が discarded-value expression(結果が捨てられる)に該当するので odr-use には当たらないと思うのですがどうでしょう。 ただ、 -g オプションでエラーになるというのは気になりますね。
私なりに規格書を読んだのですが、discarded-value expression に該当する箇所は、
- void に明示的にキャストされた式
- カンマ演算子の左側の部分式
- 式文の式
の 3 つしか見つけられませんでした。 上記の enabler はこの 3 つのいずれにも該当しないので、odr-used に該当するのではないかなぁ、と。 ちょっと SO にでも聞いてみます。
やはり SO でも odr-used になると言う意見でした。 なお、-g 付きでも -O も一緒に指定するとリンクエラーにはなりませんでした。 http://melpon.org/wandbox/permlink/Bo8kJPVgWiQKr1R7 ちなみに、llvm にはバグレポは出してるんですが、UB だからほっとくって決めた記憶がある、とのコメントが付いてます。(まだ閉じられてはいないのですが)
fixed: commit 59fa680cb5ffc3d092534e4476bcf630991bfd9c