C ++和const引用临时绑定问题(在C ++ 0X中实现D语言传递值和引用规则)

时间:2011-01-11 20:51:03

标签: c++ templates c++11 metaprogramming

我想知道什么扩展可以模仿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

你有什么想法?任何建议/评论/帮助表示赞赏!

1 个答案:

答案 0 :(得分:3)

右值参考重载:

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