in C ++ 1y code>, puis-je avoir une classe de référence qui se lie à une chaîne littérale mais non à
char * code> ou
char [] & Code> ou similaire?
3 Réponses :
class LitRf{ const char* data_; Sz size_; public: LitRf(const char* /*?*/ s) : data_{s},size_{sizeof(s)} { /*?*/ } LitRf(char*) = delete; };
C ++ 11 retiré le seul moyen formel de détecter un littéral à chaîne en tant que tel, à savoir via sa conversion implicite au pointeur vers le non-const.
Quoi qu'il en soit à l'aide du petit tour, il fallait utiliser la macro. P >
en C ++ 11 et plus tard, le mieux que vous puissiez faire est d'établir une convention solide que un tableau de IE, avec votre exemple, p> Notez l'utilisation de Const EM> est un littéral. P >
Taille_t code> au lieu d'un type éventuellement signé
SZ code >. Cela garantit que le code compilera avec g ++. Malheureusement, ce compilateur, ou des versions plus anciennes de celui-ci, a un bug où il est tout à fait insistant sur
Taille_t code>, sinon il refuse d'accepter le code. P> P>
Merci. Char Cons [] Code> ~
String Literal Code> est un compromis raisonnable. Malheureusement, cela initialisera également à partir d'un tableau de caractères non constitué. (Peu importe le
sz code>. Je ne savais pas que c'était quelque chose - je l'utilise comme un
Typedef code> pour
std :: taille_t code> dans mon Espace de noms)
Mais vous ne pouvez pas différencier un tableau de Const Char code> et a
const code> de
char code>
Pourquoi Tailleofof (S) - 1 CODE>? Je sais, la résiliation 0, mais OP ne soustrait pas cela à l'origine.
Ah, oubliez-le - je suppose que l'op ne veut pas faire sizeof (s) code> parce que c'est 1 dans son cas - il signifiait probablement
strylen code> qui correspondrait bien à votre code.
Ajout d'un constructeur inaccessible et supprimé pour empêcher la construction d'une matrice de non- const code>
char code>.
Je suppose que le meilleur que vous puissiez faire est d'utiliser Ajoutez un constructeur de tableau de caractères non supprimé pour interdire l'appelant avec un tableau non-Const. P> const char (& s) [n] code> (avec
modèle
class LitRf
{
const char* data_;
Sz size_;
public:
// Called by the macro MakeLitRf. Unlikely to be called directly unless the user knows what he's doing.
LitRf(const char *s, void *)
: data_{s}, size_{N}
{}
// Called without macro! Throw a compiler error, explaining what's wrong.
LitRf(const char *s)
{
static_assert(false, "Please use the macro `MakeLitRf` with a string literal to construct a `LitRf`.");
}
};
#define MakeLitRf(s) LitRf(s "", nullptr)
Le mieux que je puisse arriver est de fournir une surcharge de matrice Static_assert ou utilisez le mot-clé explicite.
@Borglaireur Mais je ne pense pas qu'il existe un moyen de distinguer un littéral à chaîne et une matrice Cons-Char.
@BorGlaader Comment allez-vous
static_assert code> que quelque chose est un littéral à chaîne? Et comment
explicite code> aide ici? En réalité, si vous pouvez
static_assert code> que quelque chose est un littéral à chaîne, vous pouvez également utiliser le même état avec SFIAE pour contrôler la résolution de la surcharge pour ne pas se lier à la fonction en premier lieu.
@Borglaireur s'il vous plaît partagez-la.
Je suppose que le mieux que vous puissiez faire est d'utiliser
const char (& s) [n] code> (avec
modèle code>) comme type de paramètre. Mais il se lie également à n'importe quel réseau de Cons-Char, autre qu'un littéral à chaîne.
@Holyblackcat C'est une sorte de , comme je l'ai dit "Le meilleur que je puisse arriver" avec "ou j'aurais dû dire le plus proche. Je ne pense pas que les besoins / besoins opés sont nécessaires à 100%.
Code de démonstration pour mon dernier commentaire: ideone.com/d9olzv
@Borglaireur Aucun de vos appels de test n'est appelé avec un littéral à chaîne. Ils utilisent tous les deux des variables, pas des littéraux. Je comprends la question qui est exactement ce qui devrait être probihited ...
@Leemes Votre solution se lie également aux tableaux de caractères non-Const.
Je sais. Vous ne pouvez pas changer cela. La constance peut toujours être ajoutée, mais non supprimée. Vous ne pouvez ajouter qu'une surcharge non constituée, mais
= Supprimer code> IT.
Avez-vous vraiment voulu dire
sizeof (s) code>? Parce que c'est 1 dans votre cas ... Vous vouliez probablement dire
strallen (s) code> ou
Tailleof (s) - 1 code> si
s code> est un tableau. Ou
Tailleof (s) code> même dans ce cas? Notez la terminaison zéro, qui est incluse dans la taille de la matrice, mais pas dans la taille de la chaîne (SHLEN).
@LEEMES
TIMILOF CODE> est généralement de 4 (arches 32 bits, char_bit == 8) ou 8 (64 bits arcs) pour un pointeur ou la taille de stockage (y compris la terminaison 0) pour un littéral ou une matrice. Je voulais dire mon
taille _ code> pour stocker la taille de stockage (exactement comme dans votre réponse), mais soustraire ou non soustrait 1 de la taille supporte peu de pertinence à la question. ;-)
Ouais, je voulais dire 4 bien sûr;)