2011-01-11 5 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:背景については、次の2つの参照(主にアレキ)を参照してください?

主な違いの1つは、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 

あなたの考えは?どんな提案/コメント/ヘルプも感謝しています!右辺値参照の

+1

私の思考:あなたはDを好きなら、それを使います! –

+0

私はおそらく、しかし現実的な考慮事項は、この時点ではオプションではありません:) – stepelu

+0

興味深い質問。私は本当にこの動作を無効にすることもできるようにしたいと思います。それらの "束縛された"一時参照への参照が返され、それらのいくつかは全体のプログラム分析以外の何ものによっても検出されない場合、多数のバグが作成されます... –

答えて

3

過負荷:

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

興味深い提案をありがとう!余分なオーバーロードを忘れるのは簡単なので、私は単一の宣言にとどまることを望んでいたでしょう... – stepelu

+0

また、T&とT &&があいまいさを引き起こすと言うオーバーロードのため、関数テンプレートでは機能しません... – stepelu

+2

リンカーエラーが発生した場合は、 'void f(X &&)= delete;'を実行してコンパイル時エラーを取得することもできます。 – UncleBens