每当传递左值时存储const引用,并且每当传递右值时存储副本

时间:2017-04-16 20:34:07

标签: c++ c++14 rvalue-reference typetraits

请考虑以下代码:

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) };
}

意图是scalar_reference返回的foo持有std::decay_t<T>的const引用,只要foo使用左值和foo调用int x; foo(x)使用右值调用。

上述代码不起作用。例如,如果我们调用Tint&operator(),因此int&也将返回const(因为public static void main(String[] args) { String option1 = "o1v1,o1v2,o1v3"; String option2 = "o2v1,o2v2,o2v3"; String option3 = "o3v1,o3v2,o3v3"; ArrayList<String> output = new ArrayList<String>(); String[] options1 = option1.split(","); String[] options2 = option2.split(","); String[] options3 = option3.split(","); for(int i=0; i<options1.length; i++){ StringBuilder sb = new StringBuilder(); sb.append(options1[i]); sb.append(options2[i]); sb.append(options3[i]); output.add(sb.toString()); } System.out.println(output); }限定符没有对参考类型的影响)。

那么,我们如何更改代码?

1 个答案:

答案 0 :(得分:2)

operator()的返回类型是唯一的问题吗?如果是这样,您可以先删除引用:

std::decay_t<T> const& operator()() const { return m_value; }