const字符串丢弃限定符

时间:2012-02-20 23:25:00

标签: c++

我有一些代码:

const string MY_STRINGS[3] = { "A", "B", "C" };

当我尝试这样做时:

int main() {
  MY_STRINGS[1] = MY_STRINGS[2];
}

我收到以下错误:

  

将'const std :: string'作为'std :: basic_string的'this'参数...& std :: basic_string :: operator = ...'丢弃限定符。

不确定。说得通。我无法分配到const string

但是当我做以下事情时:

int main() {
  const string SOME_STRINGS[3] = MY_STRINGS;
  MY_STRINGS[1] = MY_STRINGS[2];
}

这编译并运作。发生了什么变化,现在为什么要编译?

3 个答案:

答案 0 :(得分:0)

首先,避免使用ALL_CAPS命名您的标识符。

其次,我真的不相信你的第二个代码片段会实际编译。

在你的编译器中尝试这个,如果这也编译,你的编译器就坏了:

int main()
{
   int foo[3] = {1, 2, 3};
   int bar[3] = foo; // Should fail to compile here.
}

答案 1 :(得分:0)

我相信GCC会复制数组。从而确保const数组是不可变的,并且变量数组是可变的。

#include <string>
#include <iostream>

using namespace std;

int main() {
    string varStrs[] = {"unchanged", "changed"};
    const string constStrs[2] = varStrs;

    varStrs[0] = varStrs[1];
    //constStrs[0] = constStrs[1]; // <-- will not compile

    cout << "const str: " << constStrs[0] << endl;
    cout << "var str: " << varStrs[0] << endl;

    return 0;
}

我在GCC 4.1.2版本上进行了测试

答案 2 :(得分:0)

编译器错误。

首先,const string SOME_STRINGS[3] = MY_STRINGS;不是合法的C ++。它必须是GCC扩展或允许对数组进行复制初始化的东西。

其次,这个扩展似乎会破坏对最基本的类型安全违规(分配给const)的检测。这令人担忧。