我经常遇到传值和移动习语:
struct Test
{
Test(std::string str_) : str{std::move(str_)} {}
std::string str;
};
但在我看来,通过 const 引用或 rvalue 引用在某些情况下可以保存副本。就像是:
struct Test1
{
Test1(std::string&& str_) : str{std::move(str_)} {}
Test1(std::string const& str_) : str{str_} {}
std::string str;
};
或者也许使用转发引用来避免编写两个构造函数。就像是:
struct Test2
{
template<typename T> Test2(T&& str_) : str{std::forward<T>(str_)} {}
std::string str;
};
是这样吗?如果是这样,为什么不使用它呢?
此外,看起来 C++20 允许使用自动参数来简化语法。我不确定在这种情况下的语法是什么。考虑:
struct Test3
{
Test3(auto&& str_) : str{std::forward<decltype(str_)>(str_)} {}
std::string str;
};
struct Test4
{
Test4(auto str_) : str{std::forward<decltype(str_)>(str_)} {}
std::string str;
};
编辑:
建议的问题是信息丰富的,但他们没有提到“汽车”案例。