1

忽略做我所描述的事情的理智,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()使用 inFoo的构造函数是否会阻止创建额外的字符串副本?

并且为了澄清起见,这种设计是否意味着不应该尝试在点和点处使用和bs,但是在两个地方使用都是安全的?fs// 1// 2_s

4

1 回答 1

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::moveFoo构造函数中删除它,打印输出将更改为:

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

所以假设 aString(String&&)比 a 快String(const String&),前者更快。否则,不会。

为了澄清起见,这种设计是否意味着不应该尝试在点 // 1 和 // 2 使用 bs 和 fs,但是在这两个地方使用 _s 是安全的?

正确的。

于 2012-11-22T16:02:09.843 回答