查看以下代码:
#include<string>
#include<iostream>
using T = std::string;
void baz(T& v) { std::cout << v << std::endl; }
void boo(const T& v) { std::cout << v << std::endl; }
int main() {
baz( T("Passing an rvalue to be assigned to a lvalue&") ); //<--- This call is invalid
boo( T("Passing an rvalue to be assigned to a constant lvalue&") );
}
标准告诉我们第一个函数调用因为显而易见的原因无效,但第二个函数调用无效,因为它可以被解释为&#34;生成一个绑定到函数boo范围的变量,保持一个等于传递给函数&#34;的右值的左值。至少就我对标准的理解而言。
但是,添加辅助功能,例如:
constexpr T &to_lvalue(T &&value) noexcept { return value; }
调用函数baz使用它来包装参数:
baz( to_lvalue( T("Passing a rvalue which will be transformed into an lvalue reference bound to the scope of baz") ) );
被认为是完全有效的代码和(根据我的理解)它基本上会产生完全相同的东西,即构造一个绑定到baz
那么为什么在使用rvalue调用baz时,编译器是否会为您生成此代码?它宣传没有运行时开销,并且行为似乎已经明确定义。我有什么东西在这里失踪吗?或者是以这种方式定义的标准,以免错误地&#34;使用一个预期会改变一个值的函数?