http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58815
--- Comment #11 from ulf <q1 at oxyba dot de> --- i see evil implicit conversion. i modified lines 254, 337 and 421 to explicit operator long long() const { return (long long)__val; } like suggested in n3407. #include<decimal/decimal> int main(){ std::decimal::decimal32 x(101.5051); long long a = (long long)x; // OK long long b = static_cast<long long>(x); // OK //long long c = x; // error //long d = (long)x; // error //long e = static_cast<long>(x); // error std::decimal::decimal64 y(101.5051); long long f = (long long)y; // OK long long g = static_cast<long long>(y); // OK //long long h = y; // error //long i = (long)y; // error //long j = static_cast<long>(y); // error std::decimal::decimal128 z(101.5051); long long k = (long long)z; // OK long long l = static_cast<long long>(z); // OK //long long m = z; // error //long n = (long)z; // error //long o = static_cast<long>(z); // error return 0; } some other issues regarding std::decimal std::is_decimal_floating_point<std::decimal::decimalXXX> in type_traits see page 7, chapter 3.11.1 and 2 (page 62) in www.open-std.org/jtc1/sc22/open/n4112.pdf std::numeric_limits<std::decimal::decimalXXX> in limits see chapter 3.3 in http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1977.html