昨天我看了一些关于在if constexpr
的else
语句中使用static_assert(false, "Some message")
的答案,根据标准来说这被认为是不合法的,尽管某些编译器(包括MSVC2017)会接受它。QT也会将其标记为错误。
我的问题是,下面的代码是否符合标准? (我倾向于认为是,但我想得到确认。)
template <typename TypeOfValue>
static void PushValue(duk_context* ctx, TypeOfValue value) {
// Push value onto duktape stack
if constexpr (std::is_same<TypeOfValue, int>::value) {
// Push int
duk_push_int(ctx, value);
} else if constexpr (std::is_same<TypeOfValue, uint32_t>::value) {
// Push uint
duk_push_uint(ctx, value);
} else {
// Unsupported type
static_assert(bool_value<false, TypeOfValue>(), "Unsupported type");
}
}
template <bool value, typename T>
static constexpr bool bool_value() {return value;}
编辑:
从我得到的评论中看来,bool_value 应该像这样定义:
template<bool value, typename T>
struct bool_value {
static constexpr bool value = value;
};
使用模式
// Unsupported type
static_assert(bool_value<false, TypeOfValue>::value, "Unsupported type");
只有当bool_value可以被特化为一个版本,该版本返回表达式bool_value<false, TypeOfValue>::value
的true时,它才是良构的。
对于每个可能的特化都是
false`。 - Evgbool_value<false, TypeOfValue>::value
总是false
,除非你实际上有一个返回true
的特化(例如std::is_void_t<TypeOfValue>
)。考虑将 [tag:language-lawyer] 标签添加到您的问题中。 - Evg