使用placement new 时,std::construct_at 通过指向volatile 的指针转换的目的是什么?

Wal*_*ter 8 c++ casting volatile object-construction

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

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

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

return ::new (static_cast<void*>(p))
    T(std::forward<Args>(args)...);
Run Code Online (Sandbox Code Playgroud)

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

Sto*_*ica 5

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*
Run Code Online (Sandbox Code Playgroud)

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

  • 如果这些演员变得更长,我将不得不购买更大的显示器。 (3认同)
  • @Ayxan - C 风格的演员... ewww (2认同)