16

我最近围绕 C++0x 的 glvalues、xvalues 和 prvalues 以及右值引用的概念进行了思考。但是,我仍然无法理解一件事:

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

4

2 回答 2

16

我讨厌循环,但是对函数类型的右值引用是对函数类型的右值引用。有一个函数类型这样的东西,例如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不能用右值参数构造函数类型。即使T是 const 也不行。

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

于 2011-08-10T20:31:43.940 回答
0

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

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

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

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

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

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

void bar(const int& value); 

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

int main()
{
    int temp = foo();
    bar(temp);
}
于 2011-08-10T20:03:55.300 回答