我想知道什么扩展可以模仿D语言规则来传递值并通过C ++中的引用规则传递。有关背景信息,请参阅以下两个参考文献(主要是Alexandrescu):
http://bartoszmilewski.wordpress.com/category/d-programming-language/page/2/
和
http://groups.google.com/group/comp.std.c++/msg/303e3bf2407a7609?
其中一个关键区别是在D 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
你有什么想法?任何建议/评论/帮助表示赞赏!
答案 0 :(得分:3)
右值参考重载:
void f(X&&); // undefined
void f(const X& x) {...}
f( X() ); // error: f(X&&) undefined