什么是函数类型的右值引用?

时间:2011-08-10 19:42:18

标签: c++11 rvalue-reference

我最近关注了C ++ 0x的glvalues,xvalues和prvalues以及rvalue引用的概念。但是,有一件事我仍然无法做到:

什么是“对函数类型的右值引用”?在草稿中多次提到它。为什么要引入这样的概念?有什么用途?

2 个答案:

答案 0 :(得分:15)

我讨厌循环,但函数类型的右值引用是对函数类型的右值引用。存在诸如功能类型之类的东西,例如, void ()。你可以形成一个右值引用。

N3055引入的分类系统而言,它是一个xvalue。

它的用途稀少而且模糊不清,但并非无用。考虑例如:

void f() {}
...
auto x = std::ref(f);

x的类型为:

std::reference_wrapper<void ()>

如果你查看reference_wrapper的概要,它包括:

reference_wrapper(T&) noexcept;
reference_wrapper(T&&) = delete; // do not bind to temporary objects

在此示例中,T是函数类型void ()。因此,第二个声明形成了对函数类型的右值引用,以确保reference_wrapper不能使用rvalue参数构造。即使T是常量,也不是。

如果形成对函数的右值引用是不合法的,那么即使我们没有将rvalue T传递给构造函数,这种保护也会导致编译时错误。

答案 1 :(得分:0)

在旧的c ++标准中,禁止以下内容:

int foo();
void bar(int& value);

int main()
{
    bar(foo());
}

因为foo()的返回类型是一个rvalue,并通过引用传递给bar()。

自从(我认为)2005年以来,在visual c ++中启用了Microsoft扩展,但这是允许的。

没有c ++ 0x(或msvc)的可能的解决方法是声明

void bar(const int& value); 

或使用临时变量,存储foo()的返回值并将变量(作为引用)传递给bar():

int main()
{
    int temp = foo();
    bar(temp);
}