【发布时间】:2016-12-21 16:45:30
【问题描述】:
C++14 草案 n4140 读取
T应为枚举类型
为template <class T> struct underlying_type。
写作有多糟糕
std::conditional_t<std::is_enum<T>::value, std::underlying_type_t<T>, foo>
什么时候T 可以是任意类型?我会踏上 UB 并且编译器会删除我的 $HOME(因为语言律师说“在 UB 下任何事情都可能发生”)?
【问题讨论】:
-
UB 是在运行时发生的事情,像这样的模板函数在编译时完成它们的工作。至于“是否会删除 $HOME”,请参阅Chandler's talk
-
这是编译时评估,而不是运行时。你不会在这里遇到UB。
-
@Borgleader OK "生成的二进制文件可能会删除我的 $HOME" 吗?实际上,我什至不确定它是否构成直接写
std::underlying_type_t<void>的UB(没有std::conditional。)那里的“应该”是否意味着它的违规会导致程序格式错误? -
@nodakai: cppreference 说得很好:“如果 T 是一个完整的枚举类型,则提供一个成员 typedef 类型来命名 T 的基础类型。否则,行为是未定义的。”。编辑:所以不要尝试使用
std::underlying_type_t<void> -
@AndyG 如果我可以 100% 信任社区驱动的 wiki,我不会发布这个问题。我在 n4140 中找不到任何支持你报价中最后一条语句的语句。
标签: c++ metaprogramming template-meta-programming operator-precedence evaluation-strategy