这段代码应该调用copy还是移动构造函数

时间:2017-09-12 06:41:41

标签: c++

当前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{} };
}

根据标准,这里的实施应该做什么?它是否需要复制和移动构造函数存在(不被删除)?它应该叫哪一个?

1 个答案:

答案 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{ {} };
}