当前C ++标准中对以下案例的要求是什么?
假设我们有以下代码:
#include <iostream>
struct Foo
{
Foo() { std::cout << "Foo::Foo()" << std::endl; }
Foo(Foo&) { std::cout << "Foo::Foo(Foo&)" << std::endl; }
Foo(Foo&&) { std::cout << "Foo::Foo(Foo&&)" << std::endl; }
~Foo() { std::cout << "Foo::~Foo()" << std::endl; }
};
struct Bar
{
Foo foo;
};
int main()
{
Bar instance{ Foo{} };
}
根据标准,这里的实施应该做什么?它是否需要复制和移动构造函数存在(不被删除)?它应该叫哪一个?
答案 0 :(得分:3)
由于Foo{}
是prvalue并且您预先形成了复制初始化,因此答案取决于您正在使用的标准修订版。
C ++ 14要求移动c'tor可以访问而不是删除。尽管实际行动可能并且很可能会被取消。
C ++ 17将直接初始化成员foo
,因此复制和移动c'tor都不需要存在或无法访问。
顺便说一句,如果您选择退出复制初始化并进行直接初始化,您也可以删除C ++ 14中的move和copy c'tors:
#include <iostream>
struct Foo
{
Foo() { std::cout << "Foo::Foo()" << std::endl; }
Foo(Foo&) = delete;
Foo(Foo&&) = delete;
~Foo() { std::cout << "Foo::~Foo()" << std::endl; }
};
struct Bar
{
Foo foo;
};
int main()
{
Bar instance{ {} };
}