对函数类型的右值引用

rvalue reference to a function type

本文关键字:引用 函数 类型      更新时间:2023-10-16

众所周知,返回类型为函数值的函数调用是左值。

如果结果类型是左值引用,则函数调用是左值调用类型或对函数类型的右值引用,如果结果为xvalueType是对象类型的右值引用,否则是右值引用。

#include <iostream>
int a(){ return 1; }
int foo(){ return 1; }
int (&&bar())(){ return a; }
int main()
{
    bar() = foo; //error: cannot convert 'int()' to 'int()' in assignment
}

诊断信息有什么问题?

我强调,[expr.ass]/1:

赋值操作符(=)和复合赋值操作符都是由右向左组合的。都需要一个可修改左值作为左操作数,并返回一个指向左操作数的左值…

[basic.lval]/6:

函数不能被修改,但是指向函数的指针可以被修改。

所以你可能有一个左值指向一个函数,但它不是一个可修改的左值,不能用来修改函数。

诊断信息…留下一些需要改进的地方。Clang 3.6说,

错误:非对象类型'int()'不可赋值

更清晰