web-dev-qa-db-fra.com

Pourquoi "auto ch = unsigned char {'p'}" ne compile-t-il pas en C ++ 17?

Je suis perplexe. N'est-ce pas const auto ch = unsigned char{'p'}; une expression d'initialisation parfaitement valide? Ne parvient pas à être compilé par les trois principaux compilateurs avec des messages d'erreur presque identiques:

erreur: attendue '(' pour la construction de type ou de fonte de style fonction

Échange d'accolades pour ('p') ne change rien. Il compile cependant sans le mot clé signed ou unsigned.

Démo en ligne.

35
Violet Giraffe

Parce que seul le nom de type Word unique peut être utilisé pour ce type de conversion de type explicite .

Un nom de type mot unique suivi d'une liste d'initiation contreventée est une valeur du type spécifié designating a temporary (until C++17)whose result object is (since C++17) direct-list-initialisé avec la liste d'initiation contreventée spécifiée.

unsigned char n'est pas un nom de type Word unique, tandis que char l'est. Et cela est également vrai pour l'expression fonctionnelle de cast, c'est pourquoi ('p') ne fonctionne pas non plus.

Pour contourner ce problème, vous pouvez

using uc = unsigned char;  // or use typedef
const auto ch = uc{'p'};

Ou changez-le en d'autres styles de distribution.

const auto ch = (unsigned char) 'p';  // c-style cast expression
const auto ch = static_cast<unsigned char>('p');  // static_cast conversion
42
songyuanyao