4

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

还是我有一种非常令人作呕的感觉,这就是右值引用在 C++0x 中的原因?

编辑:

is_rvalue = !(is_reference || is_pointer) ?

4

5 回答 5

5

显然有一种方法可以确定 C++03 中的表达式是右值还是左值(我之所以这么说是因为我不确定我对该技术的理解程度)。请注意,要使该技术可用,非常需要预处理器宏。Eric Niebler 写了一篇关于它如何工作以及如何在 BOOST_FOREACH 中使用的精彩文章:

请注意,这篇文章阅读量很大(至少对我来说是这样);正如 Neibler 在其中所说:

毫无疑问,这是神秘的东西,但我们得到了一种可靠的方法来检测任何表达式的右值和左值。

使用文章中描述的右值检测至少可以帮助您处理 C++0x 的右值引用解决的一些问题。

于 2010-06-11T19:27:32.667 回答
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不会为你剪掉它。

于 2010-06-11T19:20:52.137 回答
1

还是我有一种非常令人作呕的感觉,这就是右值引用在 C++0x 中的原因?

你是对的,你需要 C++0x 和右值引用来做到这一点。

我能想到的最接近的事情是通过 const-reference 获取一些东西,因为它可以绑定到左值或右值(如果右值需要构造一个临时值,它会)。也就是说,您的代码将无法区分两者。

于 2010-06-11T19:19:34.197 回答
1

还是我有一种非常令人作呕的感觉,这就是右值引用在 C++0x 中的原因?

是的。这正是它们被添加到 C++0x 的原因。您不能在 C++ 中创建重载来区分右值和左值。

于 2010-06-11T19:19:59.173 回答
1

我正在编写一些非常通用的代码,如果可能的话需要参考,否则需要构造一个新对象。

这不会做你想要的吗?

void f(T& t);
void f(T const& t);

注意...

T t; f(t); // calls f(T&)
f(T()); // calls f(T const&)
于 2010-06-11T19:52:40.177 回答