Vous pouvez imaginer cette déclaration
const char* a = "Anthony";
de la manière suivante
const char string_literal[] = "Anthony";
const char *a = string_literal;
Autrement dit, le compilateur crée un tableau de caractères avec la durée de stockage statique qui stocke la chaîne "Anthony"
et l'adresse du premier caractère du tableau (en raison de la conversion implicite des désignateurs de tableau en pointeurs vers leurs premiers caractères) est affectée au pointeur a
.
Voici un programme démonstratif qui montre que les littéraux de chaîne sont des tableaux de caractères.
#include <iostream>
#include <type_traits>
decltype( auto ) f()
{
return ( "Anthony" );
}
template <size_t N>
void g( const char ( &s )[N] )
{
std::cout << s << '\n';
}
int main()
{
decltype( auto ) r = f();
std::cout << "The size of the referenced array is "
<< std::extent<std::remove_reference<decltype( r )>::type>::value
<< '\n';
g( r );
return 0;
}
La sortie du programme est
The size of the referenced array is 8
Anthony
La taille du littéral de chaîne (du tableau qui stocke le littéral de chaîne) est égale à 8
car la chaîne inclut également le caractère zéro de fin ' \0'
.
Dans le programme démonstratif, l'expression
std::extent<std::remove_reference<decltype( r )>::type>::value
peut remplacer seulement l'expression
sizeof( r )