Aracılığıyla paylaş


Dize ve karakter değişmez değerleri (C++)

C++ çeşitli dize ve karakter türlerini destekler ve bu türlerden her birinin değişmez değerlerini ifade etmenin yollarını sağlar. Kaynak kodunuzda, karakter kümenizi ve dize değişmez değerlerinizin içeriğini bir karakter kümesi kullanarak ifade edersiniz. Evrensel karakter adları ve kaçış karakterleri, yalnızca temel kaynak karakter kümesini kullanarak herhangi bir dizeyi ifade etmenizi sağlar. Ham dize değişmez değeri, kaçış karakterleri kullanmaktan kaçınmanızı sağlar ve tüm dize değişmez değer türlerini ifade etmek için kullanılabilir. Ayrıca, fazladan inşaat veya dönüştürme adımları gerçekleştirmek zorunda kalmadan değişmez değerler oluşturabilirsiniz std::string .

#include <string>
using namespace std::string_literals; // enables s-suffix for std::string literals

int main()
{
    // Character literals
    auto c0 =   'A'; // char
    auto c1 = u8'A'; // char
    auto c2 =  L'A'; // wchar_t
    auto c3 =  u'A'; // char16_t
    auto c4 =  U'A'; // char32_t

    // Multicharacter literals
    auto m0 = 'abcd'; // int, value 0x61626364

    // String literals
    auto s0 =   "hello"; // const char*
    auto s1 = u8"hello"; // const char* before C++20, encoded as UTF-8,
                         // const char8_t* in C++20
    auto s2 =  L"hello"; // const wchar_t*
    auto s3 =  u"hello"; // const char16_t*, encoded as UTF-16
    auto s4 =  U"hello"; // const char32_t*, encoded as UTF-32

    // Raw string literals containing unescaped \ and "
    auto R0 =   R"("Hello \ world")"; // const char*
    auto R1 = u8R"("Hello \ world")"; // const char* before C++20, encoded as UTF-8,
                                      // const char8_t* in C++20
    auto R2 =  LR"("Hello \ world")"; // const wchar_t*
    auto R3 =  uR"("Hello \ world")"; // const char16_t*, encoded as UTF-16
    auto R4 =  UR"("Hello \ world")"; // const char32_t*, encoded as UTF-32

    // Combining string literals with standard s-suffix
    auto S0 =   "hello"s; // std::string
    auto S1 = u8"hello"s; // std::string before C++20, std::u8string in C++20
    auto S2 =  L"hello"s; // std::wstring
    auto S3 =  u"hello"s; // std::u16string
    auto S4 =  U"hello"s; // std::u32string

    // Combining raw string literals with standard s-suffix
    auto S5 =   R"("Hello \ world")"s; // std::string from a raw const char*
    auto S6 = u8R"("Hello \ world")"s; // std::string from a raw const char* before C++20, encoded as UTF-8,
                                       // std::u8string in C++20
    auto S7 =  LR"("Hello \ world")"s; // std::wstring from a raw const wchar_t*
    auto S8 =  uR"("Hello \ world")"s; // std::u16string from a raw const char16_t*, encoded as UTF-16
    auto S9 =  UR"("Hello \ world")"s; // std::u32string from a raw const char32_t*, encoded as UTF-32
}

Dize değişmez değerleri sırasıyla dar karakter (tek bayt veya u8LuU çok baytlı), UTF-8, geniş karakter (UCS-2 veya UTF-16), UTF-16 ve UTF-32 kodlamalarını belirtmek için ön ek veya , , ve ön eklerine sahip olamaz. Ham dize değişmez değeri, bu kodlamaların ham sürüm eşdeğerleri için , u8RLR, , uR, ve UR ön eklerine sahip Rolabilir. Geçici veya statik std::string değerler oluşturmak için dize değişmez değerlerini veya sonek s içeren ham dize değişmez değerlerini kullanabilirsiniz. Daha fazla bilgi için aşağıdaki Dize değişmez değerleri bölümüne bakın. Temel kaynak karakter kümesi, evrensel karakter adları ve kaynak kodunuzda genişletilmiş kod sayfalarındaki karakterleri kullanma hakkında daha fazla bilgi için bkz . Karakter kümeleri.

Karakter değişmez değerleri

Karakter değişmez değeri sabit bir karakterden oluşur. Tek tırnak işaretleri ile çevrili karakterle temsil edilir. Beş tür karakter değişmez değeri vardır:

  • Örneğin, türünde charsıradan karakter değişmez değerleri 'a'

  • UtF-8 karakter sabit değerleri türü char (char8_t C++20'de), örneğin u8'a'

  • türünde geniş karakter değişmez değerleri wchar_t, örneğin L'a'

  • UTF-16 karakter sabit değerleri türü char16_t, örneğin u'a'

  • UTF-32 karakter sabit değerleri türü char32_t, örneğin U'a'

Karakter değişmez değeri için kullanılan karakter, ayrılmış karakterler ters eğik çizgi (), tek tırnak işareti (\') veya yeni satır dışında herhangi bir karakter olabilir. Ayrılmış karakterler bir kaçış dizisi kullanılarak belirtilebilir. Karakter türü, karakteri barındıracak kadar büyük olduğu sürece, karakterler evrensel karakter adları kullanılarak belirtilebilir.

Kodlama

Karakter değişmez değerleri ön eklerine göre farklı şekilde kodlanır.

  • Ön eki olmayan bir karakter değişmez değeri, sıradan bir karakter değişmez değeridir. Yürütme karakter kümesinde temsil edilebilen tek bir karakter, kaçış dizisi veya evrensel karakter adı içeren sıradan bir karakter değişmez değerinin değeri, yürütme karakter kümesindeki kodlamasının sayısal değerine eşit bir değere sahiptir. Birden fazla karakter, kaçış dizisi veya evrensel karakter adı içeren sıradan bir karakter değişmez değeri, çok karakterli sabit değerdir. Çok karakterli sabit değer veya yürütme karakter kümesinde temsil edilebilen sıradan bir karakter değişmez değeri türüne intsahiptir ve değeri uygulama tanımlıdır. MSVC için aşağıdaki Microsoft'a özgü bölüme bakın.

  • Ön ek ile L başlayan bir karakter değişmez değeri, geniş karakter değişmez değeridir. Tek bir karakter, kaçış dizisi veya evrensel karakter adı içeren geniş karakter değişmez değerinin değeri, yürütme geniş karakter kümesindeki kodlamasının sayısal değerine eşit bir değere sahiptir, ancak karakter değişmez değeri yürütme geniş karakter kümesinde temsili yoktur ve bu durumda değer uygulama tanımlıdır. Birden çok karakter, kaçış dizisi veya evrensel karakter adı içeren geniş karakterli değişmez değerin değeri uygulama tanımlıdır. MSVC için aşağıdaki Microsoft'a özgü bölüme bakın.

  • Önek ile u8 başlayan bir karakter değişmez değeri UTF-8 karakter değişmez değeridir. Tek bir karakter, kaçış dizisi veya evrensel karakter adı içeren UTF-8 karakter değişmez değerinin değeri, tek bir UTF-8 kod birimiyle (C0 Denetimleri ve Temel Latin Unicode bloğuna karşılık gelen) temsil edilebiliyorsa, ISO 10646 kod noktası değerine eşit bir değere sahiptir. Değer tek bir UTF-8 kod birimiyle temsil edilemiyorsa, program kötü biçimlendirilmiş olur. Birden fazla karakter, kaçış dizisi veya evrensel karakter adı içeren UTF-8 karakter değişmez değeri hatalı biçimlendirilmiş.

  • Önek ile u başlayan bir karakter değişmez değeri UTF-16 karakter değişmez değeridir. Tek bir karakter, kaçış dizisi veya evrensel karakter adı içeren UTF-16 karakter değişmez değerinin değeri, tek bir UTF-16 kod birimiyle (temel çok dilli düzleme karşılık gelen) temsil edilebiliyorsa, ISO 10646 kod noktası değerine eşit bir değere sahiptir. Değer tek bir UTF-16 kod birimiyle temsil edilemiyorsa, program kötü biçimlendirilmiş olur. Birden fazla karakter, kaçış dizisi veya evrensel karakter adı içeren UTF-16 karakter değişmez değeri hatalı biçimlendirilmiş.

  • Önek ile U başlayan bir karakter değişmez değeri UTF-32 karakter değişmez değeridir. Tek bir karakter, kaçış dizisi veya evrensel karakter adı içeren UTF-32 karakter değişmez değerinin değeri, ISO 10646 kod noktası değerine eşit bir değere sahiptir. Birden fazla karakter, kaçış dizisi veya evrensel karakter adı içeren UTF-32 karakter değişmez değeri hatalı biçimlendirilmiş.

Çıkış sıraları

Üç tür kaçış dizisi vardır: basit, sekizli ve onaltılık. Kaçış dizileri aşağıdaki değerlerden biri olabilir:

Değer Kaçış dizisi
yeni satır \n
ters eğik çizgi \\
yatay sekme \t
soru işareti ? Veya\?
dikey sekme \V
tek tırnak \'
Backspace \b
çift tırnak işareti \"
satır başı \r
null karakter \0
form akışı \F
sekizlik \Ooo
uyarı (zil) \A
onaltılık \xhhh

Sekizli kaçış dizisi, bir ile üç sekizli basamak arasında bir sıranın ardından gelen bir ters eğik çizgidir. Sekizli kaçış dizisi, üçüncü basamaktan daha erken karşılaşılan sekizli basamak olmayan ilk karakterde sonlandırılır. Mümkün olan en yüksek sekizli değerdir \377.

Onaltılık kaçış dizisi, bir ters eğik çizgi, ardından karakteri xve ardından bir veya daha fazla onaltılık basamak dizisidir. Baştaki sıfırlar yoksayılır. Normal veya u8 önekli bir karakter değişmez değerinde en yüksek onaltılık değer 0xFF. L ön ekli veya u ön ekli geniş karakter değişmez değerinde en yüksek onaltılık değer 0xFFFF. U ön ekli geniş karakter değişmez değerinde en yüksek onaltılık değer 0xFFFFFFFF.

Bu örnek kod, sıradan karakter değişmez değerleri kullanan kaçış karakterlerinin bazı örneklerini gösterir. Aynı çıkış dizisi söz dizimi diğer karakter değişmez değerleri türleri için de geçerlidir.

#include <iostream>
using namespace std;

int main() {
    char newline = '\n';
    char tab = '\t';
    char backspace = '\b';
    char backslash = '\\';
    char nullChar = '\0';

    cout << "Newline character: " << newline << "ending" << endl;
    cout << "Tab character: " << tab << "ending" << endl;
    cout << "Backspace character: " << backspace << "ending" << endl;
    cout << "Backslash character: " << backslash << "ending" << endl;
    cout << "Null character: " << nullChar << "ending" << endl;
}
/* Output:
Newline character:
ending
Tab character:  ending
Backspace character:ending
Backslash character: \ending
Null character:  ending
*/

Ters eğik çizgi karakteri (\), bir çizginin sonuna yerleştirildiğinde bir çizgi devamlılığı karakteridir. Ters eğik çizgi karakterinin karakter değişmez değeri olarak görünmesini istiyorsanız, bir satıra (\\ ) iki ters eğik çizgi yazmanız gerekir. Satır devamlılığı karakteri hakkında daha fazla bilgi için bkz . Çeviri Aşamaları.

Microsoft'a özgü

Dar bir çok karakterli sabit değerden değer oluşturmak için, derleyici tek tırnaklar arasındaki karakter veya karakter dizisini 32 bitlik bir tamsayı içinde 8 bit değerlere dönüştürür. Sabit değerdeki birden çok karakter, yüksek düzenden düşük düzene kadar gereken şekilde karşılık gelen baytları doldurur. Derleyici daha sonra tamsayıyı normal kurallara göre hedef türe dönüştürür. Örneğin, bir char değer oluşturmak için derleyici düşük sıralı bayt alır. Bir veya char16_t değeri oluşturmak wchar_t için derleyici düşük sıralı sözcüğü alır. Derleyici, atanan bayt veya sözcüğün üzerinde herhangi bir bit ayarlanırsa sonucun kesildiğini uyarır.

char c0    = 'abcd';    // C4305, C4309, truncates to 'd'
wchar_t w0 = 'abcd';    // C4305, C4309, truncates to '\x6364'
int i0     = 'abcd';    // 0x61626364

Üçten fazla basamak içeriyor gibi görünen sekizli kaçış dizisi, 3 basamaklı sekizli sıra olarak kabul edilir ve ardından izleyen basamaklar çok karakterli sabit değerde karakterler olarak kabul edilir ve bu da şaşırtıcı sonuçlar verebilir. Örnek:

char c1 = '\100';   // '@'
char c2 = '\1000';  // C4305, C4309, truncates to '0'

Sekizli olmayan karakterler içeriyor gibi görünen kaçış dizileri, son sekizli karaktere kadar sekizlik bir sıra olarak değerlendirilir ve ardından kalan karakterler çok karakterli sabit değerde sonraki karakterler olarak değerlendirilir. İlk sekizli olmayan karakter ondalık basamaksa C4125 uyarısı oluşturulur. Örnek:

char c3 = '\009';   // '9'
char c4 = '\089';   // C4305, C4309, truncates to '9'
char c5 = '\qrs';   // C4129, C4305, C4309, truncates to 's'

Değeri C2022'den \377 daha yüksek olan sekizli bir kaçış dizisi: 'ondalık değer': karakter için çok büyük.

Onaltılık ve onaltılık olmayan karakterlere sahip gibi görünen bir kaçış dizisi, son onaltılık karaktere kadar onaltılık bir kaçış dizisi ve ardından onaltılık olmayan karakterler içeren çok karakterli sabit değer olarak değerlendirilir. Onaltılık basamak içermeyen bir onaltılık kaçış dizisi, derleyici hatası C2153'e neden olur: "onaltılık değişmez değerlerin en az bir onaltılık basamağı olmalıdır".

char c6 = '\x0050'; // 'P'
char c7 = '\x0pqr'; // C4305, C4309, truncates to 'r'

ile L önekli geniş karakter sabit değeri çok karakterli bir dizi içeriyorsa, değer ilk karakterden alınır ve derleyici C4066 uyarısını oluşturur. Eşdeğer sıradan çok karakterli sabit değerin davranışından farklı olarak sonraki karakterler yoksayılır.

wchar_t w1 = L'\100';   // L'@'
wchar_t w2 = L'\1000';  // C4066 L'@', 0 ignored
wchar_t w3 = L'\009';   // C4066 L'\0', 9 ignored
wchar_t w4 = L'\089';   // C4066 L'\0', 89 ignored
wchar_t w5 = L'\qrs';   // C4129, C4066 L'q' escape, rs ignored
wchar_t w6 = L'\x0050'; // L'P'
wchar_t w7 = L'\x0pqr'; // C4066 L'\0', pqr ignored

Microsoft'a özgü bölüm burada sona erer.

Evrensel karakter adları

Karakter değişmez değerleri ve yerel (ham olmayan) dize değişmez değerlerinde, herhangi bir karakter evrensel karakter adıyla temsil edilebilir. Evrensel karakter adları, bir ön ek \U ve ardından sekiz basamaklı Unicode kod noktası veya dört basamaklı Unicode kod noktası tarafından oluşturulan bir önektir \u . İyi biçimlendirilmiş bir evrensel karakter adı oluşturmak için sırasıyla sekiz veya dört basamak da mevcut olmalıdır.

char u1 = 'A';          // 'A'
char u2 = '\101';       // octal, 'A'
char u3 = '\x41';       // hexadecimal, 'A'
char u4 = '\u0041';     // \u UCN 'A'
char u5 = '\U00000041'; // \U UCN 'A'

Vekil Çiftler

Evrensel karakter adları, D800-DFFF vekil kod noktası aralığındaki değerleri kodlayamaz. Unicode vekil çiftleri için, kullanarak \UNNNNNNNNevrensel karakter adını belirtin; burada NNNNNNNN, karakterin sekiz basamaklı kod noktasıdır. Derleyici gerekirse bir vekil çift oluşturur.

C++03'te, dil yalnızca bir karakter alt kümesinin evrensel karakter adlarıyla temsil edilmesine izin verdi ve aslında geçerli Unicode karakterlerini temsil etmeyen bazı evrensel karakter adlarına izin verdi. Bu hata C++11 standardında düzeltildi. C++11'de hem karakter hem de dize değişmez değerleri ve tanımlayıcılar evrensel karakter adlarını kullanabilir. Evrensel karakter adları hakkında daha fazla bilgi için bkz . Karakter Kümeleri. Unicode hakkında daha fazla bilgi için bkz . Unicode. Vekil çiftler hakkında daha fazla bilgi için bkz . Vekil Çiftler ve Ek Karakterler.

Dize sabit değerleri

Dize değişmez değeri, birlikte null olarak sonlandırılan bir dize oluşturan karakter dizisini temsil eder. Karakterler çift tırnak içine alınmalıdır. Aşağıdaki dize değişmez değerleri türleri vardır:

Dar dize değişmez değerleri

Dar dize değişmez değeri, türündeki ön eksiz, çift tırnak sınırlandırılmış, null olarak sonlandırılan bir dizidir const char[n]; burada n, dizinin bayt cinsinden uzunluğudur. Dar dize değişmez değeri, çift tırnak işareti (), ters eğik çizgi ("\) veya yeni satır karakteri dışında herhangi bir grafik karakteri içerebilir. Dar dize değişmez değeri, yukarıda listelenen kaçış dizilerini ve bayt içine sığan evrensel karakter adlarını da içerebilir.

const char *narrow = "abcd";

// represents the string: yes\no
const char *escaped = "yes\\no";

UTF-8 kodlanmış dizeler

UTF-8 kodlanmış dize u8 önekli, çift tırnakla ayrılmış, null olarak sonlandırılan türünde const char[n]bir dizidir; burada n , kodlanmış dizinin bayt cinsinden uzunluğudur. U8 önekli dize değişmez değeri çift tırnak işareti (), ters eğik çizgi ("\) veya yeni satır karakteri dışında herhangi bir grafik karakteri içerebilir. U8 önekli dize değişmez değeri, yukarıda listelenen kaçış dizilerini ve herhangi bir evrensel karakter adını da içerebilir.

C++20 taşınabilir char8_t (UTF-8 kodlanmış 8 bit Unicode) karakter türünü tanıtır. C++20'de değişmez u8 önekler yerine charkarakterleri veya dizelerini char8_t belirtir.

// Before C++20
const char* str1 = u8"Hello World";
const char* str2 = u8"\U0001F607 is O:-)";
// C++20 and later
const char8_t* u8str1 = u8"Hello World";
const char8_t* u8str2 = u8"\U0001F607 is O:-)";

Geniş dize değişmez değerleri

Geniş dize değişmez değeri, 'L' ön ekli olan ve çift tırnak işareti (), ters eğik çizgi (\") veya yeni satır karakteri dışında herhangi bir grafik karakteri içeren null olarak sonlandırılan sabit wchar_t dizisidir. Geniş bir dize değişmez değeri, yukarıda listelenen kaçış dizilerini ve herhangi bir evrensel karakter adını içerebilir.

const wchar_t* wide = L"zyxw";
const wchar_t* newline = L"hello\ngoodbye";

char16_t ve char32_t (C++11)

C++11 taşınabilir char16_t (16 bit Unicode) ve char32_t (32 bit Unicode) karakter türlerini tanıtır:

auto s3 = u"hello"; // const char16_t*
auto s4 = U"hello"; // const char32_t*

Ham dize değişmez değerleri (C++11)

Ham dize değişmez değeri, çift tırnak işareti (), ters eğik çizgi ("\) veya yeni satır karakteri de dahil olmak üzere herhangi bir grafik karakteri içeren, herhangi bir karakter türünde null olarak sonlandırılan bir dizidir. Ham dize değişmez değerleri genellikle karakter sınıflarını kullanan normal ifadelerde ve HTML dizeleri ile XML dizelerinde kullanılır. Örnekler için şu makaleye bakın: Bjarne Stroustrup'un C++11 hakkında SSS'si.

// represents the string: An unescaped \ character
const char* raw_narrow = R"(An unescaped \ character)";
const wchar_t*  raw_wide  = LR"(An unescaped \ character)";
const char*     raw_utf8a = u8R"(An unescaped \ character)"; // Before C++20
const char8_t*  raw_utf8b = u8R"(An unescaped \ character)"; // C++20
const char16_t* raw_utf16 = uR"(An unescaped \ character)";
const char32_t* raw_utf32 = UR"(An unescaped \ character)";

Sınırlayıcı, ham dize değişmez değerinin açılış parantezinin hemen önüne gelen ve kapatma parantezini hemen izleyen 16 karaktere kadar kullanıcı tanımlı bir dizidir. Örneğin, sınırlayıcı dizisinde R"abc(Hello"\()abc" şudur abc ve dize içeriği olur Hello"\(. Hem çift tırnak işaretleri hem de parantezler içeren ham dizeleri ayırmak için sınırlayıcı kullanabilirsiniz. Bu dize değişmez değeri bir derleyici hatasına neden olur:

// meant to represent the string: )"
const char* bad_parens = R"()")";  // error C2059

Ancak sınırlayıcı bunu çözer:

const char* good_parens = R"xyz()")xyz";

Kaynakta yeni bir satır (kaçış karakteri değil) içeren bir ham dize değişmez değeri oluşturabilirsiniz:

// represents the string: hello
//goodbye
const wchar_t* newline = LR"(hello
goodbye)";

std::string değişmez değerleri (C++14)

std::stringdeğişmez değerler, kullanıcı tanımlı değişmez değerlerin (aşağıya bakın) Standart Kitaplık uygulamalarıdır ve bunlar (sonekle birliktes) temsil "xyz"s edilir. Bu tür bir dize değişmez değeri, belirtilen ön eke bağlı olarak , std::wstring, std::u32stringveya std::u16stringtüründe std::stringgeçici bir nesne oluşturur. Yukarıdaki gibi ön ek kullanılmadığında bir std::string oluşturulur. L"xyz"s bir std::wstringüretir. u"xyz"s bir std::u16string ve U"xyz"s bir std::u32string üretir.

//#include <string>
//using namespace std::string_literals;
string str{ "hello"s };
string str2{ u8"Hello World" };     // Before C++20
u8string u8str2{ u8"Hello World" }; // C++20
wstring str3{ L"hello"s };
u16string str4{ u"hello"s };
u32string str5{ U"hello"s };

Sonek s , ham dize değişmez değerlerinde de kullanılabilir:

u32string str6{ UR"(She said "hello.")"s };

std::stringdeğişmez değerler, dize> üst bilgi dosyasındaki ad alanında <std::literals::string_literals tanımlanır. std::literals ve std::literals::string_literalsher ikisi de satır içi ad alanları olarak bildirildiğinden, std::literals::string_literals otomatik olarak doğrudan ad alanına stdaitmiş gibi kabul edilir.

Dize değişmez değerlerinin boyutu

ANSI char* dizeleri ve diğer tek baytlı kodlamalar için (UTF-8 değil), dize değişmez değerinin boyutu (bayt cinsinden), sonlandırıcı null karakter için karakter sayısı artı 1'dir. Diğer tüm dize türleri için boyut, karakter sayısıyla kesin olarak ilişkili değildir. UTF-8, bazı kod birimlerini kodlamak için en çok dört char öğe kullanır ve char16_t veya wchar_t UTF-16 olarak kodlanmış tek bir kod birimini kodlamak için iki öğe (toplam dört bayt için) kullanabilir. Bu örnek, geniş dize değişmez değerinin bayt cinsinden boyutunu gösterir:

const wchar_t* str = L"Hello!";
const size_t byteSize = (wcslen(str) + 1) * sizeof(wchar_t);

strlen() ve'ninwcslen(), boyutu dize türünün öğe boyutuna eşit olan sonlandırıcı null karakterin boyutunu içermediğini fark edin: bir veya char8_t* dizede bir char* bayt, veya char16_t* dizelerinde wchar_t* iki bayt ve dizelerde dört baytchar32_t*.

Visual Studio'nun Visual Studio 2022 sürüm 17.0'ın önceki sürümlerinde, dize değişmez değerinin uzunluk üst sınırı 65.535 bayttır. Bu sınır hem dar dize değişmez değerleri hem de geniş dize değişmez değerleri için geçerlidir. Visual Studio 2022 sürüm 17.0 ve sonraki sürümlerinde bu kısıtlama kaldırılır ve dize uzunluğu kullanılabilir kaynaklarda sınırlıdır.

Dize değişmez değerlerini değiştirme

Dize değişmez değerleri (değişmez değerler dahil std::string değil) sabit olduğundan, bunları değiştirmeye çalışmak (örneğin, str[2] = 'A') derleyici hatasına neden olur.

Microsoft'a özgü

Microsoft C++'da, sabit char olmayan veya wchar_tişaretçisini başlatmak için dize değişmez değeri kullanabilirsiniz. Bu sabit olmayan başlatmaya C99 kodunda izin verilir, ancak C++98'de kullanım dışıdır ve C++11'de kaldırılır. Dizeyi değiştirme girişimi, aşağıdaki örnekte olduğu gibi erişim ihlaline neden olur:

wchar_t* str = L"hello";
str[2] = L'a'; // run-time error: access violation

(Dize değişmez değer türü dönüştürmeyi devre dışı bırak) derleyici seçeneğini ayarladığınızda, bir dize değişmez değeri sabit değer sabit olmayan bir karakter işaretçisine dönüştürüldüğünde derleyicinin /Zc:strictStrings hata yaymasına neden olabilirsiniz. Standartlara uygun taşınabilir kod için bunu öneririz. Doğru (const) türüne auto çözümlediğinden, dize değişmez değeriyle başlatılan işaretçileri bildirmek için anahtar sözcüğünü kullanmak da iyi bir uygulamadır. Örneğin, bu kod örneği derleme zamanında bir dize değişmez değerine yazma girişimini yakalar:

auto str = L"hello";
str[2] = L'a'; // C3892: you cannot assign to a variable that is const.

Bazı durumlarda, aynı dize değişmez değerleri yürütülebilir dosyada yer kazanmak için havuza alınabilir. Dize değişmez değeri havuzunda, derleyici belirli bir dize değişmez değerine yapılan tüm başvuruların, her başvurunun dize değişmez değeri ayrı bir örneğine işaret etmek yerine bellekte aynı konuma işaret etmesine neden olur. Dize havuzunu etkinleştirmek için derleyici seçeneğini kullanın /GF .

Microsoft'a özgü bölüm burada sona erer.

Bitişik dize değişmez değerlerini birleştirme

Bitişik geniş veya dar dize değişmez değerleri birleştirilir. Bu bildirim:

char str[] = "12" "34";

bu bildirimle aynıdır:

char atr[] = "1234";

ve bu bildirime:

char atr[] =  "12\
34";

Dize değişmez değerlerini belirtmek için katıştırılmış onaltılık kaçış kodlarının kullanılması beklenmeyen sonuçlara neden olabilir. Aşağıdaki örnek, ASCII 5 karakterini ve ardından f, i, v ve e karakterlerini içeren bir dize değişmez değeri oluşturmayı arar:

"\x05five"

Gerçek sonuç, alt çizginin ASCII kodu olan onaltılık 5F ve ardından i, v ve e karakterleridir. Doğru sonucu almak için şu kaçış dizilerinden birini kullanabilirsiniz:

"\005five"     // Use octal literal.
"\x05" "five"  // Use string splicing.

std::stringdeğişmez değerleri (ve ilgili std::u8string, std::u16stringve std::u32string) türler için basic_string tanımlanan işleçle + birleştirilebilir. Bunlar bitişik dize değişmez değerleriyle aynı şekilde de birleştirilebilir. Her iki durumda da dize kodlaması ve sonek eşleşmelidir:

auto x1 = "hello" " " " world"; // OK
auto x2 = U"hello" " " L"world"; // C2308: disagree on prefix
auto x3 = u8"hello" " "s u8"world"z; // C3688, disagree on suffixes

Evrensel karakter adlarına sahip dize değişmez değerleri

Yerel (ham olmayan) dize değişmez değerleri, evrensel karakter adı dize türünde bir veya daha fazla karakter olarak kodlanabildiği sürece herhangi bir karakteri temsil etmek için evrensel karakter adlarını kullanabilir. Örneğin, genişletilmiş bir karakteri temsil eden evrensel karakter adı ANSI kod sayfası kullanılarak dar bir dizede kodlanamaz, ancak bazı çok baytlı kod sayfalarında veya UTF-8 dizelerinde veya geniş bir dizede dar dizelerde kodlanabilir. C++11'de, Unicode desteği ve char32_t* dize türleri tarafından char16_t* genişletilir ve C++20 bunu türüne char8_t genişletir:

// ASCII smiling face
const char*     s1 = ":-)";

// UTF-16 (on Windows) encoded WINKING FACE (U+1F609)
const wchar_t*  s2 = L"😉 = \U0001F609 is ;-)";

// UTF-8  encoded SMILING FACE WITH HALO (U+1F607)
const char*     s3a = u8"😇 = \U0001F607 is O:-)"; // Before C++20
const char8_t*  s3b = u8"😇 = \U0001F607 is O:-)"; // C++20

// UTF-16 encoded SMILING FACE WITH OPEN MOUTH (U+1F603)
const char16_t* s4 = u"😃 = \U0001F603 is :-D";

// UTF-32 encoded SMILING FACE WITH SUNGLASSES (U+1F60E)
const char32_t* s5 = U"😎 = \U0001F60E is B-)";

Ayrıca bkz.

Karakter kümeleri
Sayısal, Boole ve işaretçi değişmez değerleri
Kullanıcı tanımlı değişmez değerler