2013-04-14 11 views
6

C++ 11 Aşağıdaki birlik bildirmek: I -std kullanılarak 4.7.0 g ++ bu kodu derlemeC++ 11, anonim olmayan sendikaların statik veri üyeleri içermesine izin veriyor mu? Gelen

union U4 { 
    char c; 
    int i; 
    static int si; 
}; 

= C++ 11 -pedantic-hataları, I (aşağıdaki hatalarıyla minör düzenleme):

error: local class ‘union U4’ shall not have static data member ‘int U4::si’ [-fpermissive]
error: ‘U4::si’ may not be static because it is a member of a union

FDIS (N3242) açıkça bildiğim kadarıyla gördüğünüz gibi, adlandırılmış sendikaların statik veri üyeleri izin vermez. Ama aynı zamanda FDIS 'un, isimli durağan veri üyelerini, FDIS'in "statik olmayan veri üyeleriyle" [bölüm 9.5 paragraf 1] ne yapılabileceğine tekrar tekrar başvurmadığını da göremiyorum. Aksine, standart, sendikaların statik veri üyelerine izin verir.

Sendikanın statik veri üyesi için herhangi bir kullanım amacı yoktur. İhtiyacım olsaydı, muhtemelen anonim birliği içeren bir sınıfla yeterince yakın bir etki elde edebilirdim. Ben sadece standardın amacını anlamaya çalışıyorum. Yardım için

teşekkürler.

+2

Birincisi, yerel sınıf tipleri, ('§9.4.2/5') genel olarak statik veri üyesi var izin verilmez. Yerel olmayan bir sendikadaki statik veri üyesi için Clang iyi bir şekilde derler. – Xeo

cevap

4

Evet, buna izin verilir. Standardın 9. Bölümü, aksi belirtilmedikçe sınıflar, yapılar ve birlikler için class kelimesini kullanır. Statik sendika üyeleri üzerindeki tek kısıtlamalar, yerel sendikalar (9.4.2/5) ve anonim sendikalar (9.5/5) içindir. LiveWorkSpace üzerinde

#include <iostream> 

union Test 
{ 
    static int s; 
}; 

int Test::s; 

int main() 
{ 
    Test::s = 1; 
    std::cout << Test::s; 
} 

Çıktı. Clang 3.2 üzerinde derler ama gcc 4.8.0 veya Intel 13.0.1 değil. Görünüşe göre bu bir gcc/Intel hatasıdır. İlk hata buradan kaynaklanıyor yüzden tüm

+0

sed s/LiveWorkspace üzerinde Ideone/Output üzerinde çıktı/g – niXman

+0

@niXman tnx, sabit! – TemplateRex

+0

@rhalbersma Wow. Güzel cevap. Çok teşekkürler. Bu cevaptan ek bir fayda olarak, yerel ve yerel olmayan sendikalar arasında farklılıklar olduğunu öğrendim. Oh, ve bir yerel sendika statik üye olamaz sebebi [hurma alnını tokat] depolama bildirmek için hiçbir yolu yoktur olmasıdır. Tekrar teşekkürler. – sschurr

İlgili konular