Sprout icon indicating copy to clipboard operation
Sprout copied to clipboard

sprout::enabler の定義が無い

Open kariya-mitsuru opened this issue 9 years ago • 4 comments

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

kariya-mitsuru avatar Mar 15 '15 10:03 kariya-mitsuru

こうした使用では enabler が discarded-value expression(結果が捨てられる)に該当するので odr-use には当たらないと思うのですがどうでしょう。 ただ、 -g オプションでエラーになるというのは気になりますね。

bolero-MURAKAMI avatar Mar 24 '15 13:03 bolero-MURAKAMI

私なりに規格書を読んだのですが、discarded-value expression に該当する箇所は、

  1. void に明示的にキャストされた式
  2. カンマ演算子の左側の部分式
  3. 式文の式

の 3 つしか見つけられませんでした。 上記の enabler はこの 3 つのいずれにも該当しないので、odr-used に該当するのではないかなぁ、と。 ちょっと SO にでも聞いてみます。

kariya-mitsuru avatar Mar 30 '15 09:03 kariya-mitsuru

やはり SO でも odr-used になると言う意見でした。 なお、-g 付きでも -O も一緒に指定するとリンクエラーにはなりませんでした。 http://melpon.org/wandbox/permlink/Bo8kJPVgWiQKr1R7 ちなみに、llvm にはバグレポは出してるんですが、UB だからほっとくって決めた記憶がある、とのコメントが付いてます。(まだ閉じられてはいないのですが)

kariya-mitsuru avatar Apr 22 '15 17:04 kariya-mitsuru

fixed: commit 59fa680cb5ffc3d092534e4476bcf630991bfd9c

bolero-MURAKAMI avatar Apr 05 '16 09:04 bolero-MURAKAMI