tl'dr:它不启用任何优化,因为它不能以任何方式保证对象未被修改。它只会增加混淆。 不要使用它!
首先我们需要说明“被别人改变”的意思。
我们显然会处理的最后一个:
让采取简单的代码,并期待在组件(-O3
)
auto foo(int& a)
{
a = 24;
return a;
}
foo(int&): # @foo(int&)
mov dword ptr [rdi], 24
mov eax, 24
ret
由于你可以看到mov eax, 24
。返回值设置为24
。这意味着编译器可以假定没有其他代码可以修改a
引用的对象(即使a
是非const引用)。
让我们返回之前增加一个函数调用代码:
auto bar() -> void;
auto foo(int& a)
{
a = 24;
bar();
return a;
}
foo(int&): # @foo(int&)
push rbx
mov rbx, rdi
mov dword ptr [rbx], 24
call bar()
mov eax, dword ptr [rbx]
pop rbx
ret
编译器不能够访问的bar
身体,所以它必须考虑到bar
可以修改该对象由a
引用。
现在根据您的问题将const&
添加到方程中并不会改变方程式。只能通过当前函数中调用的代码修改对象。
有const&&
不以任何方式改变这一点。 a
引用的对象仍然可以修改。
据我所知右值引用是指给定的对象是暂时的, 让其他人访问其数据
事实并非如此。右值引用可以绑定到prvalues
(临时)或xvalues
。你自己的例子说明这一点:
operator const T &&() { return std::move(val); }
这里绑定到val
你是不是临时的(如果封装的对象不是)。
乔纳森Wakely钉它在一篇评论:
你举的例子证明,常量牛逼& &不必绑定到一个 暂时的,有可能是绑定到 相同的几个右值引用事情:
Immutable<int> i{};
const int&& r1 = i;
const int&& r2 = i;
所以这是对const&
情况
无异 这里是我对吧:
int g = 24;
auto bar() -> void { g = 11; };
auto foo(const int&& a)
{
bar();
return a;
}
auto test()
{
return foo(std::move(g));
}
test(): # @test()
mov dword ptr [rip + g], 11
mov eax, 11
ret
上面的代码是有效的1),它表明,在通话过程中由const int&&
参数a
引用的对象被修改foo
。
1)虽然我不是100%肯定,我相当肯定
限定 – bolov
这意味着在一些其他对象非const引用改变“别人改变。” – aaalex88
看到我的答案。这有不同的场景。一个是“被另一个线程修改”,另一个是“被相同线程修改” – bolov