【发布时间】:2016-07-07 09:31:22
【问题描述】:
我有以下代码,它应该在编译时计算一个字节中的位数。
template<unsigned char c, size_t I>
struct char_bit
{
static constexpr size_t get() noexcept {
return c > 0 ? char_bit<c << 1, I + 1>::get() : I
}
};
int main()
{
std::cout << char_bit<1, 0>::get();
}
通过将1 传递给unsigned char 参数,我期望得到最终结果 8,因为它将向左移动 8 次,直到字符变为 0。
但是,使用 Clang 3.7.1 进行编译时,出现编译错误:
错误:非类型模板参数计算结果为 256,不能 缩小到类型 'unsigned char' [-Wc++11-narrowing]
为什么会这样?我该如何解决?
【问题讨论】:
-
你试过了吗:char_bit::get() 或 char_bit ::get() ?
-
@SvenNilsson 为什么这两个都有效?
-
@SvenNilsson 我不会做第一个,因为它会将一个字节的大小限制为 8 位。今天这听起来是合法的,但嘿,你永远不知道。除此之外,这与 OP 的目标精神背道而驰。
-
是的,它们可以工作,因为我猜它们将值限制为最大 255