无法在constexpr对象内的constexpr函数内使用static_assert

问题描述

我想在编译时检查某些字符串是否在字符串列表中。因此,如果我在主体中使用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

编译错误甚至指向带有抛出的行,这样您就可以看到错误。

演示:https://godbolt.org/z/da36dz

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...