c++ - std::underlying_type :SFINAE 是否可以防止未定义的行为?

标签 c++ c++11 enums undefined-behavior sfinae

std::underlying_type与非枚举类型一起使用时调用未定义的行为。 但是未定义的行为出现在哪里?

在此代码中:

template<typename E>
constexpr std::enable_if_t<std::is_enum<E>::value, std::underlying_type_t<E>> IntEnum(E e)
{
    return static_cast<std::underlying_type_t<E>>(e);
}

我尝试使用std::enable_if防止用户调用IntEnum与非枚举类型。但如enable_if在决定是否可以调用该函数之前先评估它,它的模板参数也会评估,包括 std::underlying_type_t<E> 。那么如果用非枚举类型调用这个 UB 吗?我该如何更改它?

最佳答案

typename std::underlying_type<E>::type即使对于非枚举类型也会进行评估(并且对 SFINAE 不友好)。

您可以使用一种间接方式来延迟评估并保持 SFINAE 友好:

template<typename E>
constexpr
typename std::enable_if_t<std::is_enum<E>::value, std::underlying_type<E>>::type
IntEnum(E e)
{
    return static_cast<std::underlying_type_t<E>>(e);
}

Demo

关于c++ - std::underlying_type :SFINAE 是否可以防止未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35746062/

相关文章:

c++ - 成员函数定义中的不完整类型

c++ - 使用删除时随机崩溃

c++ - 具有三元运算符的函数类型

c# - Linq 包含枚举数组

c++ - 为什么将 return 移动到函数末尾效率较低?

c++ - C++中优先级队列的结构排序标准

c++ - 对 STL 容器进行排序

c++ - 初始化并将 map 作为参数传递

enums - 如何在 typescript 中声明公共(public)枚举?

C# 使用管道和符号传递多个枚举值之间的区别