c++ - 为什么 std::bitset<5>{}[0] 不是 constexpr?

标签 c++ c++17

std::bitset 有 constexpr 构造函数和 constexpr operator[] 所以下面的代码编译成功:

#include <bitset>

typedef std::bitset<5> BitSet;

constexpr BitSet s1;
static_assert(!s1[0]);

购买为什么下面的代码没有?

static_assert(BitSet{}[0]);

最佳答案

当您编写 BitSet{} 时,会创建一个类型为 BitSet 的临时对象。但是 std::bitsetoperator[]对于非常量对象,不是 constexpr!

在您的第一个示例中,s1 隐含地是 const,因此它使用 const operator[],即 constexpr >.

因为你不能 const 直接限定一个临时变量(比如 const Foo() 是无效的),你总是可以只添加 const 到你的别名:

using BitSet = const std::bitset<5>;

关于c++ - 为什么 std::bitset<5>{}[0] 不是 constexpr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54599790/

相关文章:

c++ - std::forward_iterator_tag 的作用是什么?

c++ - 使用 Boost lambda 和绑定(bind)排序时出错

c++ - WinAPI : Change Color of a TreeView using CustomDraw

c++ - 充分利用 static_assert 和 std::is_invocable

c++ - 如何正确使用互斥量作为线程中成员函数的参数?

c++17 - 将 BOOST Spirit X3 与自定义词法分析器结合使用

c++ - 此代码会产生未定义的行为还是仅仅是未指定的行为?

java - 如何将 Eclipse C++ 添加到 Eclipse 经典?

c++ - 在 C++11(或更新版本)中创建 RAII 包装器而无需编写新类的最短路径是什么?

c++ - std::variant<>::get() 不能用 Apple LLVM 10.0 编译