2016-11-23 45 views
35

Aşağıdaki neden C++'da yasa dışıdır?Neden constructor sözdizimi "unsigned int" türüyle kullanılmaz?

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

ya da genel olarak: aşağıdaki ise

auto x = unsigned int(0); 

hepsi tamam

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

(Type istisna unsigned int anlamına gelir). Ayrıştırma önceliğinden dolayı

+3

Tabii ki sadece 'otomatik a = 10U' denebilir ama muhtemelen biliyordu. Kullandığınız sözdiziminin, yüzeysel olarak benzer olsa bile, yapımla ilgisi yoktur. Doğru türde hazır bilgi kullanın ve bu kadar. –

cevap

32

. Dilbilgisi kuralına göre, yalnızca basit bir tür belirteci veya yazım hatası belirteci (yani, tek kelimeli bir tür adı) ile çalışır.

(vurgu benim)

2) işlevsel döküm sentezleme basit bir tür belirleyici bir başka deyişle Typedef belirteci (oluşur, tek kelime tipi ismi: unsigned int(expression) veya int*(expression) geçerli değildir), ardından parantez içinde tek bir ifade. Bu yayın ifadesi, karşılık gelen C stili döküm ifadesine tam olarak eşdeğerdir.

Sen c tip dökme ifade veya static_cast olarak değiştirin veya Jean-FrançoisFabre önerdi @ gibi typedef belirleyici ile kullanabilirsiniz. standarttan

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

Tırnaklar, $5.2.3/1 Explicit type conversion (functional notation) [expr.type.conv]

basit bir tip-belirteci ([dcl.type.simple]) ya da typename-belirteci ([temp.res]) bir parantez isteğe ardından İfade listesi veya bir destekli başlangıç ​​listesi (başlatıcı), başlatıcı verildiğinde belirtilen türden bir değer oluşturur.

Ve

basit tip belirticilere $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

İmzasız (0) 'ın da işe yarayacağını varsayıyorum. – Asu

+0

@Asu Evet, çünkü basit bir tür belirtici. – songyuanyao

+0

Bu teklifin nereden geldiğinden emin misiniz? Teşekkürler :) – Steve

20

. int(0), unsigned int'dan önce eşleştiği için derleyici kayboldu.

auto x = (unsigned int)(0); 

veya typedef kullanmak:

Sen parantez içinde türünüzü içine zorunda sözdizimi burada Explicit type conversion (functional notation) olduğunu

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

Emin değilim "operatör önceliği" burada doğru terimdir. – juanchopanza

+3

Ben de emin değilim. Ne öneriyorsun? ayrıştırma önceliği? Ben bu şekilde düzenliyorum. –

+3

Ayrıştırma önceliği muhtemelen yeterince açık, ancak bu gerçekten sadece dilin dilbilgisinin kuralları. İşlev stili kalıplar tek bir tanımlayıcı olmalıdır. –