我有一些代码:
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];
}
这编译并运作。发生了什么变化,现在为什么要编译?
答案 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
)的检测。这令人担忧。