忽略了我正在描述的内容的理智,使用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
是否阻止了字符串的附加副本?
为了澄清,此设计是否意味着不应尝试在bs
和fs
点使用// 1
和// 2
,而是使用_s
这两个地方都安全吗?
答案 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是安全的 在这两个地方?
正确。