1 引言
在seastar
的commit log中可以看到
template<typename T>
- void do_not_optimize(T& v)
+ void do_not_optimize(const T& v)
{
asm volatile("" : : "r,m" (v));
}
就是讲函数参数从引用类型变为const引用类型,commit的备注为:
To allow passing temporaries
2 总结
const引用是个万能引用,const引用可以绑定到不同但相关类型的对象或绑定到左值,const引用可以初始化为不同类型的对象或者初始化为右值,普通的const引用则只能绑定到与该引用同类型的对象。
3 举个例子
#include <iostream>
class Foo {
public:
Foo() {}
~Foo() {}
int a;
};
void do_not_optimize(Foo &v)
{
std::cout << v.a << std::endl;
}
void do_not_optimize2(const Foo &v)
{
std::cout << v.a << std::endl;
}
int main()
{
const int& a = 10; //编译通过
// int &b = 20; //,编译错误,字面常量是右值
// do_not_optimize(Foo()); //compile error,函数返回值是临时变量,是右值
do_not_optimize2(Foo());
return 0;
}
所以这也是告诉我们函数在设计参数时,根据情况使用const &
和const
类型。
网友评论