考虑以下代码:
using flref = int(&)(double);
using frref = int(&&)(double);
int foo(double){ return 32; }
int main(){
flref l = foo; // Function lvalue references are bound to the function name
frref r = foo; // Function rvalue references are bound to the function name
return 0;
}
为什么在这种情况下左值引用和右值引用都可以绑定到函数?GCC、Clang和MSVC都可以编译此代码而不会出错。
函数名在用作表达式时是左值还是右值?
在flref l = foo;
句子中,=
的rhs是一个表达式吗?
1条答案
按热度按时间9rygscc11#
函数名在用作表达式时是左值还是右值?
命名函数的 id-expression 是函数类型的左值表达式。没有函数类型的右值表达式。
为什么函数的左引用和右引用都可以绑定到函数名?
因为函数类型的左值表达式特别免除了右值引用必须在潜在的临时物化之后由右值(特别是xvalue)表达式初始化的要求。参见[dcl.初始化参考]/5。3.1.
这可能是选择以这种方式指定的,因为它是最方便的选择。替代方案是完全禁止对函数的右值引用,这将使泛型代码变得不必要地更加难以编写,或者引入函数右值的概念,这将迫使每个人都在函数名周围编写
std::move
。在这个句子中,等号的右边是一个表达式吗?
它被称为“陈述”,而不是“句子”。变量初始化器中等号的右侧必须始终是 * 花括号初始化列表 *(i.即
= { /*...*/ }
)或 * 表达式 。如果没有大括号,那么它只能是一个表达式。顺便说一句:将“ 左值引用 ”称为“ 左引用 ”,将“ 右值引用 ”称为“ 右引用 *”是非常误导的。术语“lvalue”和“rvalue”的前C起源可能与赋值的“left”和“right”侧有关,但该含义仅适用于 C 的一小部分。