2014-12-15 17 views
13

void bir hazır bu iseYazım türü olarak geçersiz mi? C

A tipi bir hazır türü olan bir 14 ++:

- boşluk; ya da bir skaler tipte olan

; veya bir referans tipi olan

; veya

- bir dizi yazım tipi; veya

- aşağıdaki özelliklerin hepsine sahip bir sınıf tipi (Madde 9): - önemsiz bir yıkıcı sahip

- Bir toplama tipi (8.5.1) 'dir veya en az bir constexpr sahip yapıcı veya yapıcı bir kopyası değilse veya yapıcı hareket şablon ve

- onun statik olmayan veri üyeleri ve temel sınıflar tüm uçucu olmayan edebi türleri vardır. C++ 11 void olarak

bir tipi, bir hazır tip ise bir hazır türü değildir:

- skalar tipi; veya

- değişmez bir tipine ilişkin bir referans tipi; veya

- bir dizi yazım tipi; veya

- aşağıdaki özelliklerin hepsine sahip bir sınıf tipi (Madde 9): - önemsiz bir yıkıcı sahip

- her yapıcı arama ve tam ifadesi bağ ya da-Eşit kollu statik olmayan verilerin elemanları (eğer varsa) için başlatıcılar bir sabit ifadesi (5.19),

- bu bir toplama tipi (8.5.1) veya bir değil, en az bir constexpr yapıcı veya yapıcı şablonu olan yapıcısını kopyalayın veya taşıyın ve

- tüm statik olmayan veri üyeleri ve temel sınıfları, türünde geçerlidir.

Peki neden void bir literal türüdür? Ne yararları vardır?

+1

İlgili [bir boşluk dönen?] C++ 14 (http://stackoverflow.com/q/20478193/1708801) –

cevap

18

voidliteral type'dan beri, constexpr işlevleri, C++ 14'te void dönüş türüne sahip olabilir.önerisinden

It's covered in this proposal.

Alıntı: Gelişigüzel bir ifade-deyim kontroller fonksiyonlarına çağrılara izin vermek ve assert benzeri yapıları sağlamak için, izin verilen

. void aynı zamanda bir tür haline dönüşür, bu nedenle sadece bu tür kontrolleri gerçekleştirmek için mevcut olan işlevlerindeki işlevler geçersiz sayılabilir.

#define ASSERT(expr) \ 
    (void)((expr) || assert_failed(#expr, __LINE__, __FILE__)) 
void assert_failed(...); // not constexpr 
struct S { 
    std::array a<int, 100>; 
    size_t i; 

    constexpr void check_invariants() const { 
    ASSERT(i < a.size()); 
    ASSERT(a[i] == 0); 
    } 
    S(std::array<int, 100> a_, size_t i_) : a(a_), i(i_) { 
    check_invariants(); 
    } 
}; 
+0

, bir 'void' değişken bildirilebilir/geri? Açıkçası, doğal olarak yararlı değildir ve erişilemez, ancak genel/şablonlu kod için bazen işleri basitleştirebilir. – StilesCrisis

İlgili konular