gpt4 book ai didi

c++ - clang 3.3 和 constexpr 约束

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:40:00 25 4
gpt4 key购买 nike

我正在用 clang 3.3 编译一些代码,似乎可以用 gcc 4.8 编译:

原代码为:

template <std::size_t N> struct helper { typedef void type; };
template <> struct helper<64> { typedef int64_t type; };
template <> struct helper<32> { typedef int32_t type; };
template <> struct helper<16> { typedef int16_t type; };
template <> struct helper<8> { typedef int8_t type; };

template <std::size_t I, std::size_t F>
struct test
{
typedef typename helper<I+F>::type value_type;
static constexpr std::size_t frac_mask = ~((~value_type(0)) << F);
};

在 clang 中,如果我试图声明 test<16,16> 或 test<8,0> 我会得到错误:

test.cpp:41:34: error: constexpr variable 'frac_mask' must be initialized by a constant expression

static constexpr std::size_t frac_mask = ~((~value_type(0)) << F);

如果我将代码转换为:

template <std::size_t I, std::size_t F>
struct test
{
typedef typename helper<I+F>::type value_type;
typedef typename std::make_unsigned<value_type>::type mask_type;

static constexpr mask_type frac_mask = ~((~mask_type(0)) << F);
};

它在大多数情况下都能编译(I、F 的值),但是如果我声明 test<8, 0>,我会得到错误:

test.cpp:23:36: error: constexpr variable 'frac_mask' must be initialized by a constant expression

test.cpp:66:15: note: in instantiation of template class 'test<8, 0>' requested here

test.cpp:23:66: note: left shift of negative value -1

   static constexpr mask_type frac_mask = ~((~mask_type(0)) << F);

我的问题是 - 在 constexpr 的规范方面我是否违反了一些规则?此外,对于最后一个错误 - 掩码类型是无符号的 - 这是一个编译器问题,它认为我正在移动一个负值还是我误读了代码?

最佳答案

在第一种情况下,您导致了符号溢出。 C++11 5.19/2 中列出的表达式不是是常量表达式的条件之一是它涉及

a result that is not mathematically defined or not in the range of representable values for its type

通过使用定义为使用模运算的无符号类型,结果保持在范围内。据推测,GCC 对这条规则的严格程度低于 Clang。

在最后一种情况下,无符号 8 位类型被提升为 int,而不是无符号类型,因此您再次发生有符号溢出。您可以通过在取反后转换回无符号类型来解决此问题:

static constexpr mask_type frac_mask = ~(mask_type(~mask_type(0)) << F);

虽然我不太确定,也没有 Clang 安装来测试。

关于c++ - clang 3.3 和 constexpr 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18469152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com