He3*_*xxx 41 c++ language-design language-lawyer c++20
P0553R4中的功能:位运算仅限于无符号整数。该提案没有给出这一限制的理由。我可以看到,如果没有定义有符号整数的位表示,这是有意义的,但使用 C++20,我们可以保证有符号整数使用二进制补码。
对我来说,允许使用有符号整数类型调用eg似乎是合理的std::popcount
,因为实现可以简单地转换为相应的无符号类型以在无符号域中执行位操作。
P0553R4添加这个约束的原因是什么?(只是 P0553R4 和 P0907R4 之间缺少同步吗?)
Ben*_*igt 71
非常简单:无符号类型的隐式扩大转换不会改变结果。有符号类型(包括提升)的隐式扩展转换会执行符号扩展,如果输入为负数,这会更改结果。
由于整数提升而导致结果不正确的操作肯定属于“脚炮”类别。
您仍然可以将负值(表示的位模式)提供给popcount
,但您必须控制转换顺序,这有助于您获得预期的结果。
ein*_*ica 25
popcount
对位进行计数,因此采用旨在用作“位容器”的类型。
是的,确实,从 C++20 开始,有符号整数就保证了二进制补码语义,但这是一个非必要的细节 - 这正是为什么直到 C++20 才保证二进制补码的原因。如果您不是语言律师,您可能甚至都没有意识到这种变化。
因此,与其试图成为语言律师/人类百科全书,不如对可能以其他方式定义的类型的确切语义做出更少的假设。如果你做出这样的假设 - 你可能会很幸运并正确地进行popcount;但你可能会被@BenVoigt 的回答所困扰。
另请参阅我对此问题的回答中同一原则的应用。