다음 코드를 고려하시기 바랍니다 전달 될 때마다 좌변이 경과 될 때마다 const를 참조 및 사본 :스토어를 rvalue가
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를 참조를 보유하고 있다는 점이다 foo
이 rvalue와 함께 호출 될 때마다 std::decay_t<T>
은 foo
이 lvalue 및 복사본과 함께 호출 될 때마다 호출됩니다.
위의 코드는 작동하지 않습니다. 예를 들어 int x; foo(x)
을 호출하면 T
은 int&
이되므로 const
한정자는 참조 유형에 아무런 영향을 미치지 않으므로 도 int&
을 반환합니다.
코드를 변경하려면 어떻게해야합니까?
두 개의 생성자를 선언하지 않는 이유는 무엇입니까? 하나는 좌변가 참조를, 다른 하나는 우세한 참조를 사용합니까? – Daniel