无法从const int *转换为int *

时间:2014-02-20 18:45:37

标签: c++

我正在尝试编译以下代码,但我收到了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);来解决这个问题,但我仍然不明白为什么上面的代码会导致问题。

4 个答案:

答案 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指针的功能保障。