【发布时间】:2023-04-04 00:51:01
【问题描述】:
让我们考虑这个示例代码:
struct sso
{
union {
struct {
char* ptr;
char size_r[8];
} large_str;
char short_str[16];
};
const char* get_tag_ptr() const {
return short_str+15;
}
};
在[basic.expr] 中指定,只要结果指向数组的另一个元素(或超过对象或最后一个元素的结尾),就允许使用指针运算。然而,如果数组是联合的非活动成员,则在此设置中没有指定会发生什么。我相信这不是问题short_str+15 绝不是 UB。对吗?
The following question 清楚地表明了我的意图
【问题讨论】:
-
IIRC 在您真正尝试取消引用结果指针之前,它不是 UB。
-
@Someprogrammerdude 不,指针算术本身会产生未定义的行为……例如,见尾后一指针的特殊情况(您可以计算但不能取消引用) .当然,这种迂腐的 UB 永远不会给你带来麻烦,但这个问题被标记为“语言律师”。
-
但是,在此基础上,您是说当成员处于活动状态时获取的指针在不活动时变为 UB(我可以忍受)并在回到活动范围时保持 UB?老实说,我发现编译器可能会将联合优化为单个单元以外的任何东西的整个想法令人担忧。
-
你应该使用
std::variant而不是原始联合。 -
@GemTaylor 我是泛泛而谈,而不是专门针对工会。但请记住,UB 是关于行为,而不是值。取消引用指向有效对象的指针很好,无论在其他点取消引用它是否会产生 UB。
标签: c++ c++11 language-lawyer pointer-arithmetic