问题
#include <iostream>
#include <string>
using namespace std;
typedef string *q;
string f1(const q &a)
{
return *a;
}
string f2(const string* &a)
{
return *a;
}
int main()
{
string s("hello");
cout << f1(&s) << endl; //正确
cout << f2(&s) << endl; //报错,为什么?
system("pause");
return 0;
}
疑问点:将 f1 和 f2 的形参展开,二者的形式一样,但是传入相同参数时却一个正确一个错误。
解答
编译器对两者的解释不一样。
先看 f1:这里的 q 表示 string* ,const q& 就是我们常见的常量引用,我们传入一个右值 &s ,由于可以将一个const引用绑定在一个右值上,所以没有任何问题。
再看 f2:编译器对 const string* &a 的解释是首先 a 是一个引用,其次它是 const string* 类型的,而对于引用类型,实参与形参必须完全一致,所以函数要求的是 const string* 的引用,而我们传进去的是 string* ,所以会报错。
(感谢冲哥对我的技术答疑)