Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 新的+;重新解释_C++_C++17 - Fatal编程技术网

C++ 新的+;重新解释

C++ 新的+;重新解释,c++,c++17,C++,C++17,下面的代码可以编译,但我不能100%确定它是否符合标准: #include <memory> class A { public: int x; }; int main() { uint8_t m_storage[sizeof(A)]; new (m_storage) A(); auto deleter = [](A * p) { p->~A(); }; std::unique_ptr<A, decl

下面的代码可以编译,但我不能100%确定它是否符合标准:

#include <memory>

class A
{
public:
    
    int x;
};

int main()
{
    uint8_t m_storage[sizeof(A)];
    
    new (m_storage) A();
    
    auto deleter = [](A * p) { p->~A(); };
    std::unique_ptr<A, decltype(deleter)> p(reinterpret_cast<A *>(m_storage), deleter);
    
    p->x = 0;

    return p->x;
}
#包括
甲级
{
公众:
int x;
};
int main()
{
uint8_t m_存储[sizeof(A)];
新(m_存储器)A();
自动删除器=[](A*p){p->~A();};
std::唯一的ptr p(重新解释转换(存储),删除器);
p->x=0;
返回p->x;
}

这是正确使用的重新解释投射吗?

是的,这是正确的重新解释投射


尽管没有正确对齐存储。以及可能错误的新位置(应将参数强制转换为
void*
)。

如果可以,最好捕获新位置表达式生成的指针。这将需要更少的律师。相关:@IlCapitano你是说
std::launder
?看起来它可以
alignas(A)uint8_t m_存储[sizeof(A)]最好改用,例如:
std::aligned_storage\u t m_storage或者,如果需要
A
s的数组:
std::aligned_storage\u t m_storage[N]