假设我们有以下代码:
#include <iostream>
#include <string>
struct A
{
A() {}
A(const A&) { std::cout << "Copy" << std::endl; }
A(A&&) { std::cout << "Move" << std::endl; }
std::string s;
};
struct B
{
A a;
};
int main()
{
B{A()};
}
在这里,我相信 structA
不是聚合,因为它既有重要的构造函数,也有一个std::string
我认为不是聚合的成员。这大概意味着这B
也不是一个聚合。
但是我可以聚合初始化 B。此外,这可以在不调用复制或移动构造函数的情况下完成(例如ideone上的 C++0x GCC 4.5.1 )。
这种行为似乎是一种有用的优化,特别是对于组合没有廉价移动的大型堆栈类型。
我的问题是:这种聚合初始化在 C++0x 下何时有效?
编辑+跟进问题:
下面的 DeadMG 回答如下:
那根本不是聚合初始化,而是统一初始化,在这种情况下,这基本上意味着调用构造函数,并且不复制或移动可能是由 RVO 和 NRVO 完成的。
请注意,当我更改B
为以下内容时:
struct B
{
A a;
B(const A& a_) : a(a_) {}
B(A&& a_) : a(std::move(a_)) {}
};
执行移动。
因此,如果这只是统一初始化并且只是调用构造函数并且没有做任何特别的事情,那么我如何编写一个允许忽略移动的构造函数?
或者 GCC 只是没有在有效的情况下忽略此处的移动,如果是这样,是否有编译器和优化设置可以忽略移动?