2017-04-16 11 views
0

は、次のコードを考えてみてください渡されるたびに、左辺値が渡されるたびにconst参照、コピー、:ストア右辺値が

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がへのconst参照を保持していることですa std::decay_t<T>fooがlvalueで呼び出され、コピーがfooがrvalueで呼び出されたときはいつでも。

上記のコードは機能しません。たとえば、int x; foo(x)を呼び出すとTint&となるため、const修飾子は参照型には影響しないため、はint&も返します。

コードをどのように変更する必要がありますか?

+0

なぜ2つのコンストラクタを宣言するだけではないのですか。 1つは左辺値参照、もう1つは右値参照です。 – Daniel

答えて

2

唯一の問題は返品タイプoperator()ですか?その場合は、最初に参照を削除することができます。

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

ええ、あなたは正しいかもしれません。私はこれが実際に唯一の問題であることに気付かなかった。 – 0xbadf00d

関連する問題