是否定义了使用placement new更改由reference_wrapper保存的变量类型的行为?

xin*_*aiz 7 c++ reference placement-new language-lawyer c++11

我正在搞乱新的位置,并制作了这段代码:

#include <iostream>
#include <functional>
#include <new>

int main()
{
    char memory[sizeof(int)]; //memory to hold type
    auto ref = std::ref(*new (memory) int{5}); //allocating int in memory, and make a reference to it
    std::cout << ref << std::endl;
    new (memory) unsigned{6}; //"overwrite"
    std::cout << ref << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

5那么输出6,但它是否定义明确?如果是这样,如果我用作float第二种类型可以吗?

T.C*_*.C. 4

第二个放置new 表达式int重用第一个放置new 表达式( [basic.life]/1.4 ) 创建的对象的存储,并因此结束其生命周期。

由于[basic.life]/8不满足(由于类型差异),引用包装器存储的指针不会指向新对象,而是继续指向生命周期外的int对象。因此,根据[basic.life]/7 ,通过从此类指针获取的左值访问对象具有未定义的行为。


请注意,严格别名在这里无关紧要;该规则明确允许通过“与对象的动态类型相对应的有符号或无符号类型的类型”的泛左值来访问对象