为了找出答案,我用一个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&&)
所以假设 aString(String&&)
比 a 快String(const String&)
,前者更快。否则,不会。
为了澄清起见,这种设计是否意味着不应该尝试在点 // 1 和 // 2 使用 bs 和 fs,但是在这两个地方使用 _s 是安全的?
正确的。