如何判断给定参数是否是C ++ 03中的右值?我正在编写一些非常通用的代码,如果可能的话我需要参考,否则就构建一个新的对象。我可以重载以获取by-value和by-reference并让rvalue返回调用by-value函数吗?
或者我是否有一种令人作呕的感觉,这就是rvalue引用在C ++ 0x中的原因?
编辑:
is_rvalue =!(is_reference || is_pointer)?
答案 0 :(得分:5)
显然有一种方法可以确定表达式是否是C ++ 03中的右值或左值(我说显然是因为我不确定我对该技术的了解程度如何)。请注意,为了使该技术可用,非常需要预处理器宏。 Eric Niebler撰写了一篇很好的文章,介绍它是如何工作的以及如何在BOOST_FOREACH中使用它:
请注意,这篇文章非常重读(至少对我而言);正如Neibler所说:
毫无疑问,这是一个神秘的东西,但我们可以通过一种强有力的方法来检测任何表达式的右值和左值。
使用artcile中描述的右值检测可能有助于您处理至少一些C ++ 0x的右值引用解决的问题。
答案 1 :(得分:2)
如何判断给定参数在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不会为你剪掉它。
答案 2 :(得分:1)
或者我是否有一种令人作呕的感觉,这就是rvalue引用在C ++ 0x中的原因?
你是对的,你需要C ++ 0x和rvalue引用来做到这一点。
我能想到的最接近的事情是通过const-reference取一些东西,因为它可以绑定到左值或右值(如果右值需要构造一个临时值)。也就是说,您的代码将无法区分这两者。
答案 3 :(得分:1)
或者我是否有一种令人作呕的感觉,这就是rvalue引用在C ++ 0x中的原因?
烨。这正是他们被添加到C ++ 0x的原因。 你不能在C ++中创建重载来区分rvalues和lvalues。
答案 4 :(得分:1)
我正在编写一些非常通用的代码,如果可能的话需要参考,否则就构建一个新的对象。
这不是你想做的吗?
void f(T& t);
void f(T const& t);
请注意......
T t; f(t); // calls f(T&)
f(T()); // calls f(T const&)