【发布时间】:2015-01-28 05:03:49
【问题描述】:
请考虑以下代码:
class A {
private:
std::string s;
public:
A() = delete;
A(const A&) = delete;
A(A&&) = delete;
A(const std::string &a) : s(a) {}
};
现在,我想使用列表初始化来初始化 A 的数组。 g++ (4.9.1) 可以成功构建以下代码:
int main() {
A arr[2] = {{"a"}, {"b"}};
return 0;
}
但是,下面的代码失败了:
class Aggr {
private:
A arr[2];
public:
Aggr() : arr{{"a"}, {"b"}} {}
};
错误信息是,
test.cc: In constructor ‘Aggr::Aggr()’:
test.cc:22:28: error: use of deleted function ‘A::A(A&&)’
Aggr() : arr{{"a"}, {"b"}} {}
^
test.cc:11:3: note: declared here
A(A&&) = delete;
^
也就是说,列表初始化器会尝试调用移动构造函数来初始化类中的数组。然而,该代码是由 clang v3.5 成功构建的,没有任何警告。 因此,我想知道 C++11(或更高版本)针对列表初始化指定了哪些规则。提前致谢。
【问题讨论】:
-
@ZivS 一个右值引用
-
可能与您的问题相关:stackoverflow.com/questions/26685551/…
-
@marcinj,是的,是一样的。看起来像一个 GCC 错误gcc.gnu.org/bugzilla/show_bug.cgi?id=63707
-
@JonathanWakely 看起来非常相似。但是有区别,因为不涉及用户定义的析构函数,问题取决于 A 数据成员,还取决于定义 A move ctor 的方式。查看gcc.gnu.org/bugzilla/show_bug.cgi?id=64887中的测试用例
-
@Christophe,你错过的是这里的
std::string成员使析构函数变得不平凡,就像用户定义的析构函数在另一个示例中所做的那样。这是同一个错误,我已将其作为重复项关闭。
标签: c++ c++11 list-initialization