Am Sun, 19 Jul 2015 12:08:16 +0000 schrieb "Adam D. Ruppe" <destructiona...@gmail.com>:
> This line is illegal: > > > return toHexString!(Order.decreasing)(crc.finish()); > > The std.digest.toHexString and variants return a *static array* > which is static data and has a scope lifetime. > > It is horrendous a compiler bug that allows it to implicitly > convert to string - it should not compile because it silently > gives bad results, escaping a reference to temporary memory while > claiming it is immutable. > > Confusingly though, this line is fine: > > > return crcHexString(crc.finish()); > > It is an EXTREMELY subtle difference in the function signature > (and totally bug prone, yet the documentation doesn't call it > out...) > Good catch. The version returning a string is meant to be used with the interface digest API which produces ubyte[]. As we don't know the length at compile time in that case we can't return a static array. But in hindsight it might have been better to use another function for this and not an overload, especially considering the static array=>string conversion bug. Documentation pull request: https://github.com/D-Programming-Language/phobos/pull/3500 The good news is that the coversion bug has finally been fixed: https://issues.dlang.org/show_bug.cgi?id=9279