は、次のコードを考えてみてください渡されるたびに、左辺値が渡されるたびに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)
を呼び出すとT
はint&
となるため、const
修飾子は参照型には影響しないため、はint&
も返します。
コードをどのように変更する必要がありますか?
なぜ2つのコンストラクタを宣言するだけではないのですか。 1つは左辺値参照、もう1つは右値参照です。 – Daniel