简体   繁体   中英

Which std::string constructor am I using?

I see std::string has many constructors https://cplusplus.com/reference/string/string/string/ .

But which one am I using when I do:

const char* s = "abc";
string str(s);

I bet is:

from c-string (4) string (const char* s);

(4) from c-string
Copies the null-terminated character sequence (C-string) pointed by s.

But isn't a c-string always null terminated? That s isn't according to my ide/debugger (Qt Creator on macOS).

Am I on undefined behavior territory?

Should I instead do the following?

const char* s = "abc";
string str(s, 3);

That s isn't according to my ide/debugger (Qt Creator on macOS).

Your debugger is likely just not showing the terminator. String literals are always null terminated. You can see it for yourself:

#include <iostream>

int main() {
    for (char ch : "abc") {
        std::cout << +ch << '\n';
    }
}

Output:

97
98
99
0

But if you create the string manually, you are responsible for the terminator:

char cs1[] {'a', 'b', 'c'};        // not null terminated
char cs2[] {'a', 'b', 'c', '\0' }; // properly terminated
std::string s1(cs1);               // undefined behavior
std::string s2(cs2);               // OK

But isn't a c-string always null terminated?

Yes, string literals are null terminated. The debugger/ide might not be showing the null terminator in your case.

From string literal :

The type of an unprefixed string literal is const char[N] , where N is the size of the string in code units of the execution narrow encoding (until C++23)ordinary literal encoding (since C++23), including the null terminator .


Am I on undefined behavior territory?

No, not at all. Both of the given snippets are well-formed.

A string literal like "abc" is always null-terminated. You can use your first example. Typically you would write it like this though:

std::string str = "abc";

Edit, see comment below: Inside the string object str 'abc' it will most likely not be null-terminated (until you eventually call str.c_str()).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM