另一个需要强调的是,为什么 Adrian McCarthy 的方法可能是自 C + + 11以来最好的解决方案,在标准一致性、类型安全/明确清晰度和减少可能的模糊性之间达成妥协:
unsigned int flagsPreCpp11 = ~static_cast<unsigned int>(0);
auto flags = ~static_cast<unsigned int>(0); // C++11 initialization
predeclaredflags = ~static_cast<decltype(predeclaredflags)>(0); // C++11 assignment to already declared variable
我将在下面详细解释我的偏好。正如 Johannes 完全正确地提到的,这里烦恼的根本原因是关于值与根据位表示语义的问题,以及我们正在谈论的确切类型(赋值类型与可能的编译时间积分常量的类型)。由于没有标准的内置机制来显式地确保在 OP 的具体用例中所有的位都为1,因此很明显,这里不可能完全独立于值语义(std: : bitset 是一个常见的纯位层引用容器,但问题一般是关于无符号整数的)。但我们也许可以减少这里的模棱两可。