[英]const string discards qualifiers
我有一些代碼:
const string MY_STRINGS[3] = { "A", "B", "C" };
當我嘗試這樣做時:
int main() {
MY_STRINGS[1] = MY_STRINGS[2];
}
我收到以下錯誤:
將'const std :: string'作為'std :: basic_string ...&std :: basic_string :: operator = ...'的'this'參數傳遞,會丟棄限定符。
當然。 說得通。 我無法分配一個const string
。
但是當我做以下事情時:
int main() {
const string SOME_STRINGS[3] = MY_STRINGS;
MY_STRINGS[1] = MY_STRINGS[2];
}
這編譯和工作。 改變了什么,為什么現在編譯?
首先,避免使用ALL_CAPS命名您的標識符。
其次,我真的不相信你的第二個代碼片段會實際編譯。
在你的編譯器中嘗試這個,如果這也編譯,你的編譯器就壞了:
int main()
{
int foo[3] = {1, 2, 3};
int bar[3] = foo; // Should fail to compile here.
}
我相信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上測試了這個
編譯器錯誤。
首先, const string SOME_STRINGS[3] = MY_STRINGS;
不是合法的C ++。 它必須是GCC擴展或允許對數組進行復制初始化的東西。
其次,這種擴展似乎打破了甚至最基本的類型安全違規(分配給const
)的檢測。 這令人擔憂。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.