有这样的代码(什么都不做,它只是举例):
#include <iostream>
using namespace std;
int f(const int *)
{
return 0;
}
int main()
{
int * x = new int;
f(x);
getchar();
return 0;
}
在这里(在上面的代码中)一切正常。
但在这段代码中:
#include <iostream>
using namespace std;
int f(const int **) // Добавил ещё одну *
{
return 0;
}
int main()
{
int * x = new int;
f(&x); // Теперь передаю адрес указателя
getchar();
return 0;
}
Visual Studio 引发错误:
"int f(const int **)": невозможно преобразовать аргумент 1 из "int**" в "const int **"
我不明白和之间的根本区别是什么。为什么一个转换没有问题,而另一个没有?int*int**
这样做是为了避免将原始指针隐式分配给指向不可变对象的指针,绕过
const_cast:const为了使原始示例工作,再添加一个限定符就足够了。将允许转换
int * *为,int const * const *因为它不会产生上述问题: