gpt4 book ai didi

c++ - 通过其成员的地址激活嵌套 union 是否合法?

转载 作者:可可西里 更新时间:2023-11-01 18:39:04 25 4
gpt4 key购买 nike

以下代码是否合法(在 c++11/14 中)?

bool foo() {
union bar { int i; bool b; };
union baz { char c; bar b; };
auto b = baz{'x'};
auto barptr = &b.b;
auto boolptr = &barptr->b;
new (boolptr) bool{true};
return b.b.b;
}

这个例子很愚蠢,但我正在尝试使用嵌套 union 而不是用于变体成员的 char [] block 的可变参数 variant 实现,并且允许这样做将使我目前对复制构造函数的尝试更加清晰。

将其分解为两个子问题:

  1. 即使 b.b 处于非事件状态,通过访问 barptr 的成员来分配 boolptr 是否合法?
  2. boolptr 的就地构造是否激活了 b.bb.b.b

对标准的引用将不胜感激。

最佳答案

与关于 union 和类型双关的许多问题一样,不清楚您的程序是否定义了行为,尽管我强烈希望它在任何理智的实现中都能按预期运行。我可以肯定地说的是 this program :

#include <memory>
#include <new>

template <typename T>
inline void destruct(T& t) { t.~T(); }

template <typename T, typename...Args>
inline void construct(T& t, Args&&...args) {
::new((void*)std::addressof(t)) T(std::forward<Args>(args)...);
}

template <typename T>
inline void default_construct(T& t) {
::new((void*)std::addressof(t)) T;
}

bool foo() {
union bar { int i; bool b; };
union baz { char c; bar b; };
auto b = baz{'x'};
destruct(b.c);
default_construct(b.b);
construct(b.b.b, true);
return b.b.b;
}

符合标准,具有您想要的效果,并且 compiles to exactly the same assembly as the original program in modern compilers . Original :

foo():
movl $1, %eax
ret

Guaranteed-compliant :

foo():
movl $1, %eax
ret

关于c++ - 通过其成员的地址激活嵌套 union 是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26656539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com