typedef void(&&RF)(void* p);

RF rf()
{
    return f;
}

int ay[10] = { 0 };

typedef int(&&RA)[10];

RA ra()
{
    return ay; // error
}

cout << is_lvalue_reference<decltype(rf())>::value << endl; // 1

C++引用说:“对函数的右值引用是否被视为左值
是否命名”。

但是我不明白这是什么考虑因素?我想也许函数的名称总是一个左值。因此,它必须保留其左值的属性,并确保将函数名称传递到可以调用的任何位置,例如rf()(NULL)。然后,我想到了数组名称。我认为它也始终是左值,因此我编写了上面的代码以对其进行测试并出现错误。

谁能指出所有这些背后的真正原因?

最佳答案

N3055中,简要讨论了对函数的右值引用的问题:



函数没有生存期或存储期限,因此左值/右值区分对它们没有意义。另一方面,如果允许存在函数右值,则必须解决引用的段落中讨论的问题。鉴于此,在我看来,将所有函数值都强制为左值是一种合理的解决方案。

我想,另一种解决方法是完全禁止函数右值,因此任何尝试创建对函数类型的右值引用都会导致程序格式错误。我不知道是否考虑过这种方法,但是我的猜测是,这将给通用编程带来不便。

另一方面,对于任何对象类型,包括数组类型,左值和右值之间都有有意义的区别。因此,该语言禁止您将对象类型的右值引用绑定(bind)到对象类型的左值。我不确定为什么您的代码没有被编译感到惊讶。

关于c++ - 对函数的右值引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25146508/

10-14 18:42
查看更多