2017-01-28 3 views
2

을 읽었습니다. documentation for std::any_cast을 읽었습니다. API가 캐스트 객체에 값을 반환하거나 포인터를 반환하는 것이 이상하다는 것을 알았습니다. 레퍼런스를 반환하지 않는 이유는 무엇입니까? 비 포인터 유형 인수로 함수를 호출 할 때마다 사본을 작성해야합니다.`std :: any_cast`가 복사본

캐스트의 포인터 버전이 의도를 조금 더 알 수 있고 조금 더 명확 할 수 있지만 반환 된 값이 이와 같은 참조가되지 않는 이유는 무엇입니까?

template<typename ValueType> 
ValueType& any_cast(any* operand); 

대신

template <typename ValueType> 
ValueType* any_cast(any* operand); 

또한의 당신이 캐스트가 참조를 제거하는 기준을 요구하는 경우에도처럼 보인다 저장된 객체에 복사 기능 과부하의 반환 값에 대한 설명을 참조를 반환 여기에 1-3 http://en.cppreference.com/w/cpp/utility/any/any_cast

+1

그리고 만약 입력 포인터가'nullptr'이라면? 반환 된 참조를 만족시키기 위해 역 참조 할 수 없습니다. 당신이 정말로 묻고있는 것은 입력으로 참조를 취하는'any_cast'의 오버로드가 출력 대신 참조 대신 복사본을 반환하는 이유입니다. 맞습니까? –

+1

'any_cast'는 당신이 그것을 말하면 참조를줍니다. 이것은'static_cast'가 항상 복사본을 반환한다고 말하는 것과 같습니다. – ildjarn

+0

참조 할 수없는 주어진 유형의 유효한 포인터 값의 수는 표준 읽기 및 해당 표준의 진화에 따라 다르지만 nullpointer가 포함되어 있으므로 분명히 0보다 큽니다. –

답변

4

당신이 여기에 대한 C++ 표준에 대한 논의 볼 수 있습니다 https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/ngSIHzM6kDQ

을 Boost는 any_cast을이 방식으로 10 년 이상 정의했으며, static_cast 및 친구들과 일치합니다. 당신이 참조를 원한다면,이 작업을 수행 : 당신은 C++에서 이전 _cast 초 동안 할 거라고 것과 동일한

any_cast<Foo&>(x) 

합니다.

+0

그래,하지만 이건 진짜 캐스트가 아니야. 여기에 "캐스트"라는 단어는 잘못된 이름입니다. 포함 된 객체에 액세스하는 장치입니다. –

+0

그러나 여기 http://en.cppreference.com/w/cpp/utility/any/any_cast에서 설명서를 살펴 본다면 참조가 삭제됩니다. 맞습니까? – Curious

+2

@Curious : 'std :: remove_reference_t'가 반환 유형에 적용되지 않았기 때문에 내부적으로는 yes이지만 출력에는 포함되지 않습니다. 리턴 유형은 사용자가 템플리트 매개 변수에서 요구하는 것입니다. –