Juha Nieminen <nos...@thanks.invalid> writes:
> In another forum I was discussing string literals and char arrays.
> During the conversation this question occurred to me:
> In an array initialization like this:
>
> char str[] = "hello";
>
> can that "hello" even be considered a "string literal", or should it
> be classified as something else?
It's a string literal.
A string literal is a syntactic construct, a sequence of characters
in a source file. "hello" unquestionably meets the definition of
*string-literal* given in the C++ grammar.
A char array is an object that can exist during program execution.
> The question arose because an (actual) string literal has a type of
> array-of-const-char (of a size needed to store the contents of the
> string literal). So for example the type of "hello" is const char[6].
Yes.
> However, you can't initialize an array with another array. Given that
> fact, that would mean that the "hello" in
>
> char str[] = "hello";
>
> is not a const char[6] (because you can't initialize 'str' with one).
There's a specific rule that allows a char array to be initialized with
a string literal. See [dcl.init.string] in the standard.
The string literal "hello" is always of type `const char[6]`.
In most contexts, it "decays" to a pointer expression of type `const
char*` which evaluates to the address of the initial character
of the array. A string literal used as an initializer for a
character array object is one of the exceptions, where it does not
"decay". The array value is used to initialize the array object.
(Another exception is the operand of `sizeof`.)
> It's something else. In fact, the above is essentially just syntactic
> sugar for:
>
> char str[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
>
> Thus, should that "hello", in this context, be considered an initializer
> list rather than a "string literal"?
No, it's a string literal. The fact that it happens to be equivalent to
some other syntactic construct does not change that fact.
> (Yes, I wouldn't be surprised if the standard still calls it a "string
> literal". But even standards are flawed and ambiguous sometimes. No
> standard is absolutely perfect.)
Yes, standards are flawed and ambiguous, but this is not a flaw or an
ambiguity.