【发布时间】:2020-06-10 22:04:28
【问题描述】:
这是合法的 C++ (>=14),导致 char 被读取并保存到 aCode 中吗?
enum class ECode : char { Code1 = 'a' };
std::istream& operator>>(std::istream& aIn, ECode& aCode)
{
return aIn >> (std::underlying_type_t<ECode>&)aCode;
}
我更喜欢return aIn >> static_cast<std::underlying_type_t<ECode>&>(aCode),这似乎是不合法的(“不能转换为不相关类型的引用”。)
但是,这条非常相似的行是合法的,并且是我的 C 风格转换应该与以下内容相同:
return aIn >> *static_cast<char*>(static_cast<void*>(&aCode))
【问题讨论】:
-
@Quentin 有趣。由于 5 岁的答案是“这从标准中不清楚”,我仍然希望获得更新 C++ 版本的答案。我将删除 C++14 标记。
-
我建议对现有问题给予赏金,因为我认为这方面没有任何改变(无论如何我都会对这段代码皱眉 - 为什么不提取到
char,然后正确转换为ECode最后分配?它会超级快) -
这个问题与另一个问题的不同之处在于,通过类型
char访问对象永远不会违反严格的别名规则。但我没有看到任何与枚举类型及其基础类型的值表示相关的保证。 -
@AsteroidsWithWings 这正是我拥有的代码,但这仍然引发了问题。我喜欢(至少知道合法的)单行代码,即使只是为了开玩笑,即使他们没有通过代码审查;)
标签: c++ casting language-lawyer enum-class