2011-08-10 41 views
15

我最近围绕着C++ 0x的glvalues,xvalues和prvalues以及右值引用的概念。然而,有一件事还是令我困惑不解:什么是函数类型的右值引用?

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

+0

你最终明白了答案吗?我已经在答案下留下了评论,所以如果你知道澄清请提供它。谢谢 –

回答

15

我不想为圆形,但右值参照函数T ype是函数类型的右值引用。有一种功能类型,例如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不是常量。

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

+3

我想你的意思是'void()'。 'void()()'是GCC/binutils的错误解构,但[前段时间修复](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46332)。 –

+1

@Johannes:谢谢!这是最*有用的! –

+0

这是令人毛骨悚然,我有问题的理解。关于编译时错误的最后一句 - 在这种情况下SFINAE不会导致第二个声明被忽略? – Kos

0

在下面的旧C++标准是被禁止:

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

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

因为foo的返回类型()是一个右值和通过引用传递到禁止()。

这被允许使用,虽然在Visual C++中启用,因为(我认为)微软扩展2005

可能的解决方法没有的C++ 0x(或MSVC)将宣布

void bar(const int& value); 

或使用临时变量,储存FOO(的返回值),并传递变量(作为参考)吧():

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

也许我误解了这个问题,但我认为OP正在讨论对函数类型(即lambda等)的rvalues引用。 – user786653

相关问题