web-dev-qa-db-ja.com

「auto ch = unsigned char {'p'}」がC ++ 17でコンパイルされないのはなぜですか?

私は困惑しています。 const auto ch = unsigned char{'p'};は完全に有効な初期化式ではありませんか?ほぼ同じエラーメッセージで、3つの主要なコンパイラすべてでコンパイルできません。

エラー:関数スタイルのキャストまたは型構築では '('が必要です

中括弧を('p')と入れ替えても何も変わりません。ただし、signedまたはunsignedキーワードなしでコンパイルされます。

オンラインデモ

35
Violet Giraffe

この種類の 明示的な型変換 には、1語の型名しか使用できないためです。

ブレース付き初期リストが後に続く単一のワード型名は、指定されたブレース付き初期リストで指定されたタイプdesignating a temporary (until C++17)whose result object is (since C++17) direct-list-initializedのprvalueです。

unsigned charは単一のワード型名ではありませんが、charはそうです。これは関数型キャスト式にも当てはまります。そのため、('p')も機能しません。

回避策として、次のことができます

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

または、他のキャストスタイルに変更します。

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