每当传递左值时存储一个 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; }