将参数传递给基类时使用std :: move()

时间:2012-11-22 15:37:55

标签: c++ constructor c++11 move-semantics

忽略了我正在描述的内容的理智,使用std::move()函数在用于将参数传递给基础构造函数时是否会改善构造时间?

struct Bar {
    Bar(std::string);

    std::string _s;
}

struct Foo : public Bar {
    Foo(std::string);
}


struct Bar(std::string bs) : _s(std::move(bs)) {
    // 1
}

struct Foo(std::string fs) : Bar(std::move(fs)) {
    // 2
}

所以在这个例子中,move()的构造函数中使用的Foo是否阻止了字符串的附加副本?

为了澄清,此设计是否意味着不应尝试在bsfs点使用// 1// 2,而是使用_s这两个地方都安全吗?

1 个答案:

答案 0 :(得分:3)

为了找到答案,我使用假的String类重新编写了您的示例:

#include <iostream>

struct String
{
    String() {}
    String(const String&) {std::cout << "String(const String&)\n";}
    String& operator=(const String&)
        {std::cout << "String& operator=(const String&)\n"; return *this;}
    String(String&&) {std::cout << "String(String&&)\n";}
    String& operator=(String&&)
        {std::cout << "String& operator=(String&&)\n"; return *this;}
};

struct Bar {
    Bar(String);

    String _s;
};

struct Foo : public Bar {
    Foo(String);
};


Bar::Bar(String bs) : _s(std::move(bs)) {
    // 1
}

Foo::Foo(String fs) : Bar(std::move(fs)) {
    // 2
}
int main()
{
    Foo f{String()};
}

对我来说,打印出来:

String(String&&)
String(String&&)

但是,如果我从std::move构造函数中删除此Foo,则打印输出将更改为:

String(const String&)
String(String&&)

因此假设String(String&&)String(const String&)快,前者更快。否则,不是。

  

澄清一下,这个设计是否意味着不应该做出任何尝试   在点// 1和// 2使用bs和fs,但使用_s是安全的   在这两个地方?

正确。