我可以忽略“Intellisense:(E0028)表达式必须具有常量值”吗?

时间:2017-03-31 01:44:21

标签: c++ compiler-errors intellisense constexpr

我正在创建一个位掩码类来处理超过64位。我想在编译时生成掩码。下面编译并运行正常,但在使用Ctor设置单个位时在VS 2017中吐出错误消息。在Ming-w64中运行没有错误消息。我能安全地忽略VS吗?

#include <type_traits>
#include <array>


// N is number of uint64's required to hold bits, code below simplified for up to 128 bits
template<int N>
class CoreBitmaskBase
{
public:
    std::array<uint64_t, N> mBitsets_;

    constexpr CoreBitmaskBase() noexcept
        : mBitsets_()
    {}

    // Ctor for setting a single bit
    constexpr CoreBitmaskBase(const uint64_t& Bit) noexcept
        : mBitsets_(InitSetBit(Bit))
    {}

    constexpr std::array<uint64_t, N> InitSetBit(const uint64_t& Bit);
};

template<int N>
constexpr std::array<uint64_t, N> CoreBitmaskBase<N>::InitSetBit(const uint64_t& Bit)
{
    return std::array<uint64_t, N>({ (uint64_t)1 << Bit });
}

// if setting a bit index > 63, adjust mBitsets_'s second element
template<>
constexpr std::array<uint64_t, 2> CoreBitmaskBase<2>::InitSetBit(const uint64_t& Bit)
{
    if (Bit < 64) return std::array<uint64_t, 2>({ (uint64_t)1 << Bit, 0 });
    else return std::array<uint64_t, 2>({ 0, (uint64_t)1 << (Bit % 64) });
}

// B is number of bits we need for a mask
template<int B, typename Enable = void>
class CoreBitmask : public CoreBitmaskBase<1>
{
    using BaseType = CoreBitmaskBase<1>; 

public:
    constexpr CoreBitmask() noexcept
    {
    }

    constexpr CoreBitmask(const uint64_t& SetBit) noexcept
        : BaseType(SetBit)
    {
    }
};

// specialization for bitmask larger than 64 bits
template<int B>
class CoreBitmask<B, typename std::enable_if<(B > 64)>::type> : public CoreBitmaskBase<2>
{
    using BaseType = CoreBitmaskBase<2>;

public:
    constexpr CoreBitmask() noexcept
    {
    }

    constexpr CoreBitmask(const uint64_t& SetBit) noexcept
        : BaseType(SetBit)
    {
    }
};

的main.cpp

#include "CoreBitmask.h"

CoreBitmask<128> Mask1(67); // no warning

constexpr CoreBitmask<128> Mask2(67);
// E0028 expression must have a constant value
// access to uninitialized subobject(member "std::array<_Ty, _Size>::_Elems [with _Ty=uint64_t, _Size=2U]")

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。将std :: move添加到有问题的ctor时,intellisense警告会消失,如下所示:

// Ctor for setting a single bit
constexpr CoreBitmaskBase(const uint64_t& Bit) noexcept
    : mBitsets_(std::move(InitSetBit(Bit)))
{}