为什么初始化非const&来自右边的人无效?

时间:2017-08-29 12:20:48

标签: c++ implicit-conversion rvalue

查看以下代码:

#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;使用一个预期会改变一个值的函数?

0 个答案:

没有答案