在 C++14 中放置 new + reinterpret_cast:格式良好?

问题描述 投票:0回答:1

考虑以下 C++14 中的示例:

alignas(T) unsigned char data[sizeof(T)];
new (data) T();
T* p = reinterpret_cast<T*>(data);
p->something();  // UB?

此代码是否合法,或者是否违反了严格别名规则,因为

unsigned char*
可能不会被
T*
别名?如果合法,标准的哪些部分明确说明了这一点?

cppreference 有一个类似的示例,声称

std::launder
必须在 C++17 中使用。这对于没有
std::launder
的 C++14 意味着什么?

    // Access an object in aligned storage
    const T& operator[](std::size_t pos) const
    {
        // Note: std::launder is needed after the change of object model in P0137R1
        return *std::launder(reinterpret_cast<const T*>(&data[pos]));
    }
c++ language-lawyer undefined-behavior reinterpret-cast strict-aliasing
1个回答
0
投票

placement-

new
运算符返回一个指向
T
的有效指针。所以不要写:

new (data) T();
T* p = reinterpret_cast<T*>(data);

你应该写:

T* p = new (data) T();

所以在这种情况下

std::launder()
根本没有必要。

© www.soinside.com 2019 - 2024. All rights reserved.