2011-01-11 3 views
4

값으로 전달 및 전달을 위해 D 언어 규칙을 모방하는 것이 가능한지 궁금합니다. C++에서 참조 규칙에 따라.C++ 및 임시 바인딩 문제에 대한 const 참조 (C++ 0X에서 값으로 및 참조 규칙에 따라 D 언어 전달 구현)

http://bartoszmilewski.wordpress.com/category/d-programming-language/page/2/

http://groups.google.com/group/comp.std.c++/msg/303e3bf2407a7609 : 배경은 다음 두 개의 참조 (대부분 Alexandrescu의)를 참조하십시오?

주요 차이점 중 하나는 D에서 const 참조가 임시가 아닌 (const가 아닌 것과 같이) 바인딩되지 않는다는 것입니다.

그러나, 나는 다음과 같은 코드를 컴파일 실패하는 방식으로 일반적인 클래스 X를 정의 할 수있는 방법을 인식하지 오전 :

void f(const X& x) {...} 
f(X()); //Cannot disable binding of const ref to X 

하나의 가능성은 FA 템플릿 기능을 할 수 체크 rvalue/lvalue-ness가 전달 된 인수 (C++ 0X에서 가능)와 disable_if를 사용하지만 코드가 너무 많아 확장이 잘되지 않습니다.

또 다른 가능성은

template<class T> Ref<T> : public T {...} //D-style ref, does not bind to temporaries! 

같은 템플릿 클래스를 소개하고, 그러나 나는 다음과 같이 참조를 복용 템플릿 함수를 작성하는 능력을 잃어 이런 식으로

void f(Ref<const X> x) {...} //Does not look bad.... 
f(X()); //Compile error here is doable, I checked a similar example already... 

를 사용할 수하지 않습니다 컴파일 ...

template<class T> void ft(Ref<const T> x) {...} 
ft(X()); //Template deduction error 

귀하의 의견은 무엇입니까? 모든 제안/의견/도움을 주시면 감사하겠습니다! 를 rvalue 참조에

+1

내 생각은 : 당신이 D를 좋아하는 경우에 그것을 사용! –

+0

아마도,하지만 실용적인 고려 사항은이 옵션을 이번에 만들 수 없습니다 :) – stepelu

+0

흥미로운 질문. 나는이 행동을 너무 무능하게하고 싶다. "바운드 (bound)"임시 변수에 대한 참조가 반환되었을 때 많은 버그가 만들어졌으며 일부는 전체 프로그램 분석이 아닌 다른 것으로 탐지 될 수 없습니다. –

답변

3

과부하 :

void f(X&&); // undefined 
void f(const X& x) {...} 
f(X()); // error: f(X&&) undefined 
+1

재미있는 제안을 해주셔서 감사합니다! 여분의 오버로드를 잊어 버리기가 쉽기 때문에 나는 하나의 declarationn을 유지하기를 원했을 것입니다 ... – stepelu

+0

또한, T &와 T &&가 모호함을 야기 할 것이라고 오버로드하는 것으로서 함수 템플릿과 작동하지 않을 것이라고 생각합니다 ... – stepelu

+2

대신 링커 오류가 발생하면'void f (X &&) = delete;'를 시도해 컴파일 타임 오류가 발생할 수도 있습니다. – UncleBens