【发布时间】:2020-04-20 00:22:18
【问题描述】:
class Test {
public:
typedef std::set<std::pair<double, double>> DataSet;
explicit Test(const DataSet&& d) {
for (auto &itr : d) {
std::cout << "value1 = " << itr.first << '\n';
std::cout << "value2 = " << itr.second << '\n';
}
}
};
int main() {
//using namespace util;
try {
// Forwarding
Test obj( std::forward<Test::DataSet>(
{
{ 10.0, 20.0 },
{ 30.0, 40.0 },
{ 50.0, 60.0 }
}
));
std::cout << '\n';
// Move
Test obj2(std::move(Test::DataSet(
{
{ 10.0, 20.0 },
{ 30.0, 40.0 },
{ 50.0, 60.0 }
}
)
));
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
【问题讨论】:
-
也不行,直接传递初始化列表 - godbolt.org/z/AZW5xu。另外
const X &&通常是错误的,您需要X&&或const X&,具体取决于用例。 -
霍尔特;我知道我可以通过初始化列表传递对;但是在两者之间,哪一个更好,为什么?至于
const x&&和const x&,我并不特别关心它们...我这样编写构造函数只是为了能够编译std::move和std::forward...更多的是关于性能,两种不同算法之间的可读性和美观性。 -
“介于两者之间,哪个更好,为什么?” - 正如我所说,两者都不是,最好的版本是没有它们的版本。在这种情况下使用
std::move或std::forward没有意义,因此比较它们没有意义......
标签: c++ c++17 std move-semantics perfect-forwarding