【发布时间】:2023-03-23 10:16:01
【问题描述】:
对于所有重载,返回类型已指定为T&&(忽略constexpr)。
但在以下示例所附的描述中:
template<class T>
void wrapper(T&& arg)
{
// arg is always lvalue
foo(std::forward<T>(arg)); // Forward as lvalue or as rvalue, depending on T
}
如果对 wrapper() 的调用传递了一个右值 std::string,则 T 为 推导出为 std::string(不是 std::string&、const std::string& 或 std::string&&) 和 std::forward 确保右值引用是 传递给 foo。
如果对 wrapper() 的调用传递了一个 const 左值 std::string,然后将 T 推导出为 const std::string&,并且 std::forward 确保将 const 左值引用传递给 foo。
如果对 wrapper() 的调用传递了非常量左值 std::string,则 T 被推导出为 std::string&,并且 std::forward 确保一个非常量 左值引用被传递给 foo。
在第一个之后的上述两个实例中,一个左值引用而不是一个右值引用(正如T&& 所暗示的那样,这种理解是否正确?)已被记录为传递给 foo。
如果上面的理解是正确的,为什么返回值被指定为T&&?
【问题讨论】:
-
T&&并不总是意味着右值引用。我建议阅读 Scott Meyers 的文章"Universal References in C++11"。 -
看看reference collapsing是如何工作的。
-
您认为返回值还应该指定为什么?