如何在constexpr函数中使用static_assert?C++11编译报错求助
问题原因与解决方案
你遇到的问题核心在于:函数参数channel不是编译期常量表达式,无法满足static_assert对常量条件的要求。
虽然你的函数是constexpr,参数也加了const修饰,但const仅表示函数内部不能修改该参数,不代表它是编译期固定的常量;constexpr函数只是允许在传入编译期常量参数时进行编译期计算,但函数定义阶段,编译器根本不知道channel的具体值——static_assert的条件必须在编译函数定义时就能确定真假,所以报错是必然的。
正确实现方式(C++11兼容)
要实现编译期排除Channel::ALL的静态检查,应该把枚举值作为模板参数传递,模板参数是编译期常量,能被static_assert验证:
enum class Channel: char { ALL = 0, ONE = 1, TWO = 2, }; template<Channel C> inline constexpr std::size_t zeroBasedChannelIndex() { static_assert(C != Channel::ALL, "Channel::ALL doesn't map to an index"); return static_cast<std::size_t>(C) - 1; } // 调用示例: // auto idx = zeroBasedChannelIndex<Channel::ONE>();
如果必须保留函数参数形式,C++11里无法实现严格的编译期检查,只能退而求其次用运行时断言(比如assert(channel != Channel::ALL)),但这无法在编译阶段拦截错误。
内容的提问来源于stack exchange,提问作者Typhaon
相关产品推荐
相关产品推荐

