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