R ++中的Rvalues 03

时间:2010-06-11 18:52:37

标签: c++ templates lvalue rvalue c++03

如何判断给定参数是否是C ++ 03中的右值?我正在编写一些非常通用的代码,如果可能的话我需要参考,否则就构建一个新的对象。我可以重载以获取by-value和by-reference并让rvalue返回调用by-value函数吗?

或者我是否有一种令人作呕的感觉,这就是rvalue引用在C ++ 0x中的原因?

编辑:

is_rvalue =!(is_reference || is_pointer)?

5 个答案:

答案 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&)