gpt4 book ai didi

c++ - 没有 constexpr memcpy 编译器支持的 bit_cast 可能吗?

转载 作者:行者123 更新时间:2023-12-01 16:23:44 25 4
gpt4 key购买 nike

我听说std::bit_cast将在 C++20 中实现,我对实现它必然需要特殊编译器支持的结论感到有点困惑。

公平地说,我听到的论点是该实现执行 memcpy 操作,而 memcpy 通常不是 constexpr,而std::bit_cast 应该是这样,因此制作 std::bit_cast constexpr 应该需要编译器支持 constexpr > 兼容 memcpy 操作。

但是,我想知道是否可以实现兼容的 bit_cast (即定义的行为,与使用 memcpy 具有定义的行为相同)根本不需要实际调用 memcpy

考虑以下代码:

template<typename T, typename U> 
inline constexpr T bit_cast(const U & x) noexcept {
static_assert(std::is_trivial<T>::value && std::is_trivial<U>::value, "Cannot use bit_cast with non-trivial data" );
static_assert(sizeof(T) == sizeof(U), "bit_cast must be used on identically sized types");
union in_out {
volatile U in;
volatile T out;

inline constexpr explicit in_out(const U &x) noexcept : in(x)
{
}

};
return in_out(in_out(x)).out;
}

此处使用 volatile 成员来强制编译器发出必要的代码,这些代码将从成员中写入或读取,从而禁用优化,虽然我知道通常分配给 union 的一个成员并从同一 union 中的另一个成员读取是未定义的行为,C++ 标准似乎确实允许从 union 的任何成员读取 IF 它是从完全相同的 union 的另一个实例按字节复制的。在上面的代码中,这是通过在新构造的实例上显式调用默认复制构造函数来有效完成的,该实例恰好初始化了 in 数据成员。由于上面的 union 包含所有普通类型,因此在其上调用默认的复制构造函数相当于按字节复制,因此从新构造的实例的 out 成员中读取不应该仍然是未定义的行为,不是吗?

当然,我完全有可能在这里遗漏了一些非常明显的东西......我当然不能声称自己比制定这些标准的人更聪明,但是如果有人可以准确地告诉我哪些未定义的行为我在这里调用,我真的很想了解它。

最佳答案

在持续评估过程中不允许做的事情之一是 [expr.const]/4.9 :

an lvalue-to-rvalue conversion that is applied to a glvalue that refers to a non-active member of a union or a subobject thereof;

这就是您的实现的作用,因此这不是一个可行的实现策略。

关于c++ - 没有 constexpr memcpy 编译器支持的 bit_cast 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58477654/

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