这是我发现和描述here的问题的延续。
假设您有一个包含static constexpr函数的结构和一个std::bitset的类型别名(或者您希望使用const表达式的结果来模板的任何类型),如下所示:
struct ExampleStruct {
static constexpr std::size_t Count() noexcept {
return 3U;
}
using Bitset = std::bitset<Count()>;
};Visual 2015版本14.0.25029.00更新2RC以红色高亮显示Count()调用并生成错误function call must have a constant value in a constant expression。
如何使其编译,或取得类似的结果?
究竟是什么导致了这里的错误?编译器是否试图在const表达式函数之前生成类型别名?
编辑:可以在下面找到为什么这种方法不能工作的解释,但是由于没有人提供可能的解决办法,下面是我想出的一些方法:
(1)使用模板时,将类型别名存储到此类型。
template<typename T>
struct ExampleStruct {
using ThisType = ExampleStruct<T>;
static constexpr std::size_t Count() noexcept {
return 3U;
}
using Bitset = std::bitset<ThisType::Count()>;
};(2)将Count()函数移出结构体。
static constexpr std::size_t Count() noexcept {
return 3U;
}
struct ExampleStruct {
using Bitset = std::bitset<Count()>;
};(3)将constexpr方法替换为constexpr成员变量。
struct ExampleStruct {
static constexpr std::size_t Count = 3U;
using Bitset = std::bitset<Count>;
};(4)将值存储在constexpr成员变量中,并从Count()方法返回此值。
struct ExampleStruct {
private:
static constexpr std::size_t m_count = 3U;
public:
static constexpr std::size_t Count() noexcept {
return m_count;
}
using Bitset = std::bitset<m_count>;
};发布于 2016-03-31 06:18:41
您可能已经注意到,如果将一行或两行移出类主体,错误就会消失。您遇到的问题是,类成员函数定义(甚至内联定义)直到解析完整个类定义之后才会被解析;因此,当编译器看到using Bitset = std::bitset<Count()>;时,Count已经声明,但还没有定义,而未定义的constexpr函数不能在常量表达式中使用--因此您得到了所看到的错误。不幸的是,我不知道有什么好的解决方案或解决办法。
https://stackoverflow.com/questions/36323932
复制相似问题