问题描述
我想在编译时检查某些字符串是否在字符串列表中。因此,如果我在主体中使用static_assert,则可以使用。但是,如果我想在constexpr函数中使用static_assert,则会出现编译错误:
关于为什么会出现此编译错误以及如何进行此编译时间检查的任何想法?
#include <array>
#include <string_view>
class ClosedList : public std::array< std::string_view,3>
{
public:
constexpr bool hasValue( std::string_view value) const
{
for (auto& e : *this) {
if (value == e) {
return true;
}
}
return false;
}
constexpr std::string_view value(std::string_view value) const
{
static_assert( hasValue( value ),"value not in set");
return value;
}
};
int main()
{
constexpr ClosedList myList = { "red","green","blue" };
static_assert(myList.hasValue( "red" ),"value not in set" );
auto value = myList.value("red"); // compile error
}
解决方法
如果需要在constexpr方法中声明某些内容,则抛出。真。只要未在常量上下文中实际评估throw表达式,就可以显式地对其进行编译并在constexpr函数和方法中使用:
if (!hasValue(value)) {
throw std::runtime_error("value not in set");
}
然后按您想要的方式工作:
constexpr ClosedList myList { "a","b","c" };
constexpr std::string_view b = myList.value("b"); // ok
constexpr std::string_view d = myList.value("d"); // error,not a constant expression
编译错误甚至指向带有抛出的行,这样您就可以看到错误。