簡體   English   中英

const字符串丟棄限定符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM