小编god*_*sti的帖子

放置新的返回值

考虑以下C++ 14代码:

#include <cassert>
#include <new>
#include <type_traits>

struct NonStandardLayout
{
    // ...
};

int main()
{
    using T = NonStandardLayout;

    std::aligned_storage_t< sizeof(T), alignof(T) > storage;
    T *const valid_ptr = new(static_cast<void *>(&storage)) T;

    T *const maybe_ptr = reinterpret_cast<T *>(&storage);
    assert(maybe_ptr == valid_ptr); // ???

    valid_ptr->T::~T();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

对于任何类型的T,标准是否保证示例中的断言永远不会失败?

讨论

看看最新的标准(http://eel.is/c++draft/),我看不到任何对这个特定场景的引用,但我发现以下段落可以说是答案'是'.

我认为[expr.new/15]和[new.delete.placement/2]一起表明其值valid_ptr将等于地址storage总是吗?

如果是这样,是否reinterpret_cast会产生指向完全构造对象的指针?因为,[expr.reinterpret.cast/7],[expr.static.cast/13]和[basic.compound/4]似乎表明它应该是这种情况.

根据我的观察,默认分配器的库实现似乎与此类似,并且无需担心!是不是真的安全投这样?

我们如何确定两个指针是相同的,还是我们可以?

c++ language-lawyer c++14

27
推荐指数
1
解决办法
1232
查看次数

标签 统计

c++ ×1

c++14 ×1

language-lawyer ×1