Tôi đang biên soạn một số mã với kêu vang 3.3 mà dường như để biên dịch tốt với gcc 4.8:kêu vang 3.3 và constexpr trở ngại
Mã ban đầu là:
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);
};
Trong kêu vang, nếu tôi cố gắng để khai báo kiểm tra < 16,16> hoặc kiểm tra < 8.0> tôi nhận được lỗi:
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);
Chơi đùa với nó, nếu tôi chuyển đổi mã để:
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);
};
Nó biên dịch ở hầu hết các trường hợp (giá trị của I, F), nhưng nếu tôi tuyên bố thử nghiệm < 8, 0>, tôi nhận được lỗi:
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);
Câu hỏi của tôi là - là có một số quy tắc Tôi vi phạm ở đây về đặc điểm kỹ thuật của constexpr? Ngoài ra, đối với lỗi cuối cùng - loại mặt nạ không được ký - đây có phải là vấn đề về trình biên dịch mà nó cho rằng tôi đang chuyển một giá trị âm hay tôi đang đọc sai mã?
Có thể trùng lặp của [Gọi constexpr trong đối số mẫu mặc định] (http://stackoverflow.com/questions/10721130/calling-constexpr-in-default-template-argument) –
Nhập quy tắc quảng cáo chuyển đổi uint8_t thành int, được ký? –