[英]Rvalues in C++03
如何判断给定参数是否是C ++ 03中的右值? 我正在编写一些非常通用的代码,如果可能的话我需要参考,否则就构建一个新的对象。 我可以重载以获取by-value和by-reference并让rvalue返回调用by-value函数吗?
或者我有一种非常令人作呕的感觉,这就是为什么右值引用在C ++ 0x中?
编辑:
is_rvalue =!(is_reference || is_pointer)?
显然有一种方法可以确定表达式是否是C ++ 03中的右值或左值(我说显然是因为我不确定我对该技术的理解程度如何)。 请注意,为了使该技术可用,非常需要预处理器宏。 Eric Niebler撰写了一篇很好的文章,介绍它是如何工作的以及如何在BOOST_FOREACH中使用它:
请注意,这篇文章非常重读(至少对我而言); 正如Neibler所说:
毫无疑问,这是一个神秘的东西,但我们有一种强大的方法来检测任何表达式的右值和左值。
使用artcile中描述的rvalue检测可能有助于您处理至少一些C ++ 0x的右值引用解决的问题。
如何判断给定参数是否是C ++ 03中的右值?
你不能。 你所能做的就是信任你的客户并作弊:
void call_me_with_anything(const T& const_ref)
{
/* read from const_ref */
}
void call_me_with_rvalue_only_please_i_trust_you(const T& const_ref)
{
T& ref = const_cast<T&>(const_ref);
/* write through ref */
}
我正在编写一些非常通用的代码
那我恐怕C ++ 03不会为你削减它。
或者我有一种非常令人作呕的感觉,这就是为什么右值引用在C ++ 0x中?
你是对的,你需要C ++ 0x和rvalue引用来做到这一点。
我能想到的最接近的事情是通过const-reference取一些东西,因为它可以绑定到左值或右值(如果右值需要构造一个临时值)。 也就是说,您的代码将无法区分这两者。
或者我有一种非常令人作呕的感觉,这就是为什么右值引用在C ++ 0x中?
对。 这正是他们被添加到C ++ 0x的原因。 您无法在C ++中创建重载来区分rvalues和lvalues。
这不会做你想要的吗?
void f(T& t);
void f(T const& t);
注意...
T t; f(t); // calls f(T&)
f(T()); // calls f(T const&)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.