考虑以下 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]));
}
placement-
new
运算符返回一个指向 T
的有效指针。所以不要写:
new (data) T();
T* p = reinterpret_cast<T*>(data);
你应该写:
T* p = new (data) T();
所以在这种情况下
std::launder()
根本没有必要。