2016-11-23 10 views
35

C++で以下のコードが不正なのはなぜですか?"unsigned int"型でコンストラクタ構文を使用できないのはなぜですか?

auto y = int(0); 
auto z = unsigned(0); 
auto w = float(0); 

または一般に:

auto t = Type(... c-tor-args ...); 

Typeの例外はunsigned intである)以下の一方

auto x = unsigned int(0); 

はすべてOKです。

+3

あるあなただけの '自動A = 10U' と言うことができるが、あなたはおそらくそれを知っていました。使用している構文は、たとえ外見上類似していても、構築とは関係ありません。正しい型のリテラルを使用してください。 –

答えて

32

構文はここにExplicit type conversion (functional notation)です。文法規則によれば、それは単純な型指定子または型定義子指定子(すなわち、単一語タイプ名)でのみ機能する。

(強調鉱山)

2)機能的なキャスト式は単純型指定子またはtypedefの指定子(つまり、単一ワードタイプ名で構成されていますunsigned int(expression)またはint*(expression)は有効ではありません )、括弧内に1つの式が続きます。このキャスト式は、対応するCスタイルキャスト式とまったく同じです。

あなたはCスタイルのキャスト式またはstatic_castに変更し、またはジャンFrançoisFabreが提案@としてのtypedef指定子とそれを使用することができます。標準から

auto x1 = (unsigned int)(0); 
auto x2 = static_cast<unsigned int>(0); 

引用、$5.2.3/1 Explicit type conversion (functional notation) [expr.type.conv]

単純型指定子([dcl.type.simple])または括弧任意続く型名指定子([temp.res]) expression-listまたはbraced-init-list(イニシャライザ)は、イニシャライザを指定して指定された型の値を構築します。

そして$7.1.7.2/1 Simple type specifiers [dcl.type.simple]

シンプルな型指定はもちろん

simple-type-specifier: 
    nested-name-specifieropt type-name 
    nested-name-specifier template simple-template-id 
    nested-name-specifieropt template-name 
    char 
    char16_t 
    char32_t 
    wchar_t 
    bool 
    short 
    int 
    long 
    signed 
    unsigned 
    float 
    double 
    void 
    auto 
    decltype-specifier 
type-name: 
    class-name 
    enum-name 
    typedef-name 
    simple-template-id 
decltype-specifier: 
    decltype (expression) 
    decltype (auto) 
+0

私は 'unsigned(0)'も同様に動作すると仮定します。 – Asu

+0

@Asuはい、単純な型指定子なので、そうです。 – songyuanyao

+0

あなたはその見積もりの​​出所を特定することができますか?ありがとう:) – Steve

20

解析の優先順位のためです。 int(0)unsigned intより前に一致するため、コンパイラが失われます。

あなたは括弧であなたのタイプを同封する必要があります。

auto x = (unsigned int)(0); 

かのtypedefを使用します。

typedef unsigned int uint; 
auto x = uint(0); 
+2

「オペレータの優先順位」が正しい用語であるかどうかわかりません。 – juanchopanza

+3

どちらかわかりません。何をお勧めしますか?優先順位を解析していますか?私はそのように編集しています。 –

+3

解析の優先順位はおそらく十分にはっきりしていますが、これは実際には言語の文法の規則です。関数形式のキャストは単一の識別子でなければなりません。 –

関連する問題