我正在尝试编译以下代码,但我收到了C2440(visual studio)错误。我试过寻找其他资源寻求帮助,但我找不到一个好的解释。
int main()
{
int a = 100;
SomeFunction(&a);
}
void SomeFunction(const int* value)
{
//This line of code gives me the error.
int* variable = value;
cout << "Value is " << *Variable << " end" << endl;
}
我知道我可以使用int* variable = const_cast<int*> (value);
来解决这个问题,但我仍然不明白为什么上面的代码会导致问题。
答案 0 :(得分:17)
错误很明显 - 指针转换无法删除const
限定符;否则,你可能会违反常量:
int* variable = value; // Not allowed - but if it were...
*variable = 42; // BOOM! changed a constant.
如果您不希望能够更改指向的值,请保留const
const int* variable = value;
如果您确实想要更改它,请不要首先将其设为const
:
void SomeFunction(int* value)
我知道我可以使用
来解决这个问题const_cast
这是一个坏主意 - 如果您滥用const_cast
并尝试修改常量对象,您将获得未定义的行为。您应该尽可能使用const
,但不能在需要修改时使用。
答案 1 :(得分:11)
const int*
表示您拥有不允许更改的int
地址。
int*
可用于更改其指向的int
。显然,违反上述声明,您不得更改它。
const_cast
实际上并没有“解决问题”。它允许您请求更改无法更改的内容。这种尝试可能导致程序以不受控制的方式失败(正式的,未定义的行为)。在您的特定示例中,a
中的变量main
不是const
,因此const_cast
将成功更改它。但这会产生紧密耦合,与签名为const int*
的函数所做的承诺相矛盾。
答案 2 :(得分:2)
int* variable = value;
错了。
应该是,
int variable = *value
和
cout << "Value is " << variable << " end" << endl;
答案 3 :(得分:1)
const int *
表示该函数保证此地址的值不会改变,但是如果可以的话:
int * variable = value;
然后你也可以
*variable=30;
这样做会损害const指针的功能保障。