在非pod结构+初始化列表上使用operator new

时间:2012-06-20 22:33:16

标签: c++ c++11 new-operator initializer-list

我正在尝试在堆上分配包含非pod成员的结构并使用初始化列表初始化它们。但是,编译器在我的代码上遇到错误。这个片段再现了它:

#include <vector>

struct A {
    int a;
};

struct B {
    int a;
    std::vector<int> b;
};

int main() {
    std::vector<int> some_vec;
    A a = {1}; // OK
    A b = A{1}; // OK
    A *c = new A{1}; // OK(leaks, NP)
    B d = {1, some_vec}; // OK
    B e = B{1, some_vec}; // OK

    B *f = new B{1, some_vec}; // Fails to compile

    B *g = new B({1, some_vec}); // OK
}

(我知道泄漏,我知道这一点,它只是一个测试片段)

指出的行无法在GCC 4.6.3上编译,但出现此错误:

test.cpp: In function ‘int main()’:
test.cpp:19:29: error: no matching function for call to ‘B::B(<brace-enclosed initializer list>)’
test.cpp:19:29: note: candidates are:
test.cpp:7:8: note: B::B()
test.cpp:7:8: note:   candidate expects 0 arguments, 2 provided
test.cpp:7:8: note: B::B(const B&)
test.cpp:7:8: note:   candidate expects 1 argument, 2 provided
test.cpp:7:8: note: B::B(B&&)
test.cpp:7:8: note:   candidate expects 1 argument, 2 provided

显然,编译器无法使用提供的初始化列表初始化我的结构。奇怪的是,产生错误的那一行之后的下一行(我可以看到)只是复制(可能移动)来自另一个使用相同初始化列表构建的B,而不是产生任何错误。

我在做什么事吗?我的意思是,我可以使用提供的代码片段中的最后一行,但有没有理由我不能使用operator new和初始化列表创建结构?

1 个答案:

答案 0 :(得分:2)

代码应该编译和工作。我用gcc 4.7.0进行了测试,它工作正常,所以看起来修复了这个bug。如果您在标准中阅读8.5.4列表初始化,则会说List intialization can be used as the initializer in a new expression (5.3.4)