2017-04-16 4 views
0

다음 코드를 고려하시기 바랍니다 전달 될 때마다 좌변이 경과 될 때마다 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)을 호출하면 Tint&이되므로 const 한정자는 참조 유형에 아무런 영향을 미치지 않으므로 도 int&을 반환합니다.

코드를 변경하려면 어떻게해야합니까?

+0

두 개의 생성자를 선언하지 않는 이유는 무엇입니까? 하나는 좌변가 참조를, 다른 하나는 우세한 참조를 사용합니까? – Daniel

답변

2

유일한 문제는 반환 유형 operator()입니까? 그렇다면 먼저 참조를 삭제하면됩니다.

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

네, 맞을지도 모릅니다. 나는 이것이 실제로 유일한 문제임을 인식하지 못했습니다. – 0xbadf00d

관련 문제