C++ C++;使用默认构造函数进行11值初始化

C++ C++;使用默认构造函数进行11值初始化,c++,c++11,language-lawyer,C++,C++11,Language Lawyer,在以下示例中: #include <iostream> struct A { int z; A(std::string) {} A() = default; }; int main() { char buf[1000]; std::fill(buf, buf + 1000, 'x'); auto a = new(buf) A{}; std::cerr << "A.z: " << a->z <

在以下示例中:

#include <iostream>

struct A {
    int z;
    A(std::string) {}
    A() = default;
};

int main() {
    char buf[1000];
    std::fill(buf, buf + 1000, 'x');
    auto a = new(buf) A{};
    std::cerr << "A.z: " << a->z << std::endl;
}
#包括
结构A{
intz;
(std::string){}
A()=默认值;
};
int main(){
char-buf[1000];
标准:填充(buf,buf+1000,'x');
自动a=新(buf)a{};

std::cerr您在C++11中引用的值初始化措辞被认为是有缺陷的,请参阅,其中的解决方案更改了措辞(显示添加为粗体,删除为删节):

T
类型的对象进行值初始化意味着:

  • 如果
    T
    是一个(可能是cv限定的)类类型(第9条[类]),且没有默认构造函数(12.1[class.ctor]),或者是一个用户提供的或删除的默认构造函数(12.1[class.ctor]),则对象是默认初始化的调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的)

  • 如果
    T
    为a(可能符合cv条件)没有用户提供的或删除的默认构造函数的非联合类类型,则对象初始化为零,如果T的隐式声明的默认构造函数是
    T
    有一个非平凡的默认构造函数,则调用该构造函数

一些编译器——我相信GCC4.8和3.3ish以来的clang——已经实现了DR 1301的解决方案