[英]template metaprogramming - g++ eats it, clang does not
有沒有辦法讓兩個編譯器都快樂?
為了這:
template<short value>
struct static_signbits
{
enum { result = (!!(value & 0x8000) == !!(value & 0x4000)) ? (static_signbits<short(value << 1)>::result + 1) : 0 };
};
template<>
struct static_signbits<0>
{
enum
{
result = 15
};
};
clang給了我:
error: non-type template argument is not a constant expression
enum { result = (!!(value & 0x8000) == !!(value & 0x4000)) ? (static_signbits<short(value << 1)>::result + 1) : 0 };
^~~~~~~~~~~~~~~~~
對於短線演員來說顯然不滿意嗎?
顯然,我可以使用constexpr,但我還需要向后兼容C ++ 98
這是因為clang不支持常量表達式中的negative << n
。 只需改變無符號值:
template<short value>
struct static_signbits
{
enum { result = (!!(value & 0x8000) == !!(value & 0x4000)) ? (static_signbits<(short)((unsigned)value << 1)>::result + 1) : 0 };
};
clang是正確的,因為左移是負面的是未定義的行為 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.