每当传递左值时存储一个 const 引用,并在传递右值时存储一个副本
Store a const reference, whenever an lvalue is passed, and a copy, whenever an rvalue is passed
请考虑以下代码:
template<typename T>
class scalar_reference
{
public:
template<typename U>
scalar_reference(U&& value)
: m_value(std::forward<U>(value))
{}
T const& operator()() const { return m_value; }
private:
T m_value;
};
template<typename T>
scalar_reference<T> foo(T&& value) {
return scalar_reference<T>{ std::forward<T>(value) };
}
目的是 foo
编辑的 scalar_reference
return 持有对 std::decay_t<T>
的 const 引用,只要 foo
被左值调用并且每当使用右值调用 foo
时的副本。
以上代码无效。例如,如果我们调用 int x; foo(x)
,T
将是 int&
,因此 operator()
也将是 return int&
(因为 const
限定符对引用类型没有影响)。
那么,我们需要如何更改代码?
唯一的问题是operator()
的return类型吗?如果是这样,您可以先删除参考:
std::decay_t<T> const& operator()() const { return m_value; }
请考虑以下代码:
template<typename T>
class scalar_reference
{
public:
template<typename U>
scalar_reference(U&& value)
: m_value(std::forward<U>(value))
{}
T const& operator()() const { return m_value; }
private:
T m_value;
};
template<typename T>
scalar_reference<T> foo(T&& value) {
return scalar_reference<T>{ std::forward<T>(value) };
}
目的是 foo
编辑的 scalar_reference
return 持有对 std::decay_t<T>
的 const 引用,只要 foo
被左值调用并且每当使用右值调用 foo
时的副本。
以上代码无效。例如,如果我们调用 int x; foo(x)
,T
将是 int&
,因此 operator()
也将是 return int&
(因为 const
限定符对引用类型没有影响)。
那么,我们需要如何更改代码?
唯一的问题是operator()
的return类型吗?如果是这样,您可以先删除参考:
std::decay_t<T> const& operator()() const { return m_value; }