我最近围绕着C++ 0x的glvalues,xvalues和prvalues以及右值引用的概念。然而,有一件事还是令我困惑不解:什么是函数类型的右值引用?
什么是“右值引用函数类型”?它在草稿中被多次提及。为什么会引入这样一个概念?它有什么用途?
我最近围绕着C++ 0x的glvalues,xvalues和prvalues以及右值引用的概念。然而,有一件事还是令我困惑不解:什么是函数类型的右值引用?
什么是“右值引用函数类型”?它在草稿中被多次提及。为什么会引入这样一个概念?它有什么用途?
我不想为圆形,但右值参照函数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
传递给构造函数,该保护也会导致编译时错误。
我想你的意思是'void()'。 'void()()'是GCC/binutils的错误解构,但[前段时间修复](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46332)。 –
@Johannes:谢谢!这是最*有用的! –
这是令人毛骨悚然,我有问题的理解。关于编译时错误的最后一句 - 在这种情况下SFINAE不会导致第二个声明被忽略? – Kos
在下面的旧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);
}
也许我误解了这个问题,但我认为OP正在讨论对函数类型(即lambda等)的rvalues引用。 – user786653
你最终明白了答案吗?我已经在答案下留下了评论,所以如果你知道澄清请提供它。谢谢 –