繁体   English   中英

R ++中的Rvalues 03

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM