0

给定 astd::optional<T>是否可以std::optional<T>从 的地址推导出 的地址T

可能的实现:

template<typename T>
struct myoptional
{       static std::size_t getOffset(void)
        {       static const myoptional<T> s(std::inplace());
                return reinterpret_cast<const char*>(&s.value())
                       - reinterpret_cast<const char*>(&s);
        };
};
4

1 回答 1

2

它没有指定存储std::optional对象的确切位置。如果您假设同一类型的对象的位置始终相同T,您可以(见下文)使用所示方法通过对象表示获得偏移量。

但是,即使您知道对象的偏移量,您仍然无法std::optional<T>从指向T对象的指针中获得指向 的可用指针。您需要std::launder生成的指针才能使其可用,只有在 时才允许这样做sizeof(std::optional<T>) <= sizeof(T),这似乎不太可能/不可能。(否则,它将使以前无法访问的字节在术语“可达”的含义中可以访问,如 的先决条件std::launder,请参阅https://en.cppreference.com/w/cpp/utility/launder


reinterpret_cast目前尚不清楚标准是否允许使用和指针算法。该标准在这方面存在一些未解决的缺陷。

你可以做的或者(据我所知)不应该有未定义的行为是使用 aunionstd::optional<T>aunsigned char[sizeof(std::optional<T>)]而不是使用指针差异,然后你可以在循环中使用加法和指针比较来查找与值的地址匹配的字符数组中的偏移量T。参见例如这个答案

于 2022-01-18T22:43:36.520 回答