9

根据cppreferencestd::construct_at(T*p, Args&&... args)相当于

return ::new (const_cast<void*>(static_cast<const volatile void*>(p)))
    T(std::forward<Args>(args)...);

演员“通过”的需要/目的是const volatile void*什么?换句话说,为什么construct_at不简单地等同于

return ::new (static_cast<void*>(p))
    T(std::forward<Args>(args)...);

后一种代码在什么情况下会导致不良行为?

4

1 回答 1

2

std::construct_at接受T任何类型...可能具有 cv 限定符。

同时,static_cast 不可抛弃 constness。您建议的版本将失败

const foo * ptr = get_mem();
ptr = std::construct_at(ptr); // Error here when naively static casting to void*

static_cast 可能会添加 cv 限定符。所以为了通用,标准化的版本就避免了这个问题。它静态转换为指针的最 cv 限定版本void,然后删除这些限定符。

于 2020-08-09T10:48:54.317 回答