2016-10-15 4 views
3

最終指定子は、継承を禁止するクラスまたは構造体とともに使用できます。そのような場合には、我々は唯一のfinalとして私たちのクラス/構造体をマークする必要があります。最終指定子を共用体に使用する理由はありますか?

union Foo final { 
    // ... 
}; 

cpp.reference.comから:

同じ構文は、労働組合のために有効であることを

class Foo final { 
    // ... 
}; 

もっと面白いですfinalも共用体の定義で使用することができます。この場合、 の効果はありません(std :: is_finalの結果以外)。ユニオン は、労働組合と最終指定の使用量が無意味であるように見えます)

から派生することはできません。もしそうなら、組合を最終としてマークすることはなぜ可能ですか?一貫性のために?または、いくつかのものについては、type_traits?私は何かを逃して、の最後にの組合が必要な状況がありますか?

+2

「効果なし」のフェチがある場合。これは "無意味な"ものではない。 – dtech

+2

@ddriver申し訳ありませんが、私はそれをキャッチしませんでした。あなたは「フェチ」とは何を意味しますか? –

+0

私はそれが意味するものを正確に意味します。 – dtech

答えて

1

あなたが言ったように、unionは派生することはできませんので、final指定子は絶対に効果がありません。すべての表明が通過以下のコードを使用して試験することができる行動std::is_finalの結果、以外

struct P final { }; 
union U1 { }; 
union U2 final { }; // 'union' with 'final' specifier 

template <class T> 
void test_is_final() 
{ 
    static_assert(std::is_final<T>::value, ""); 
    static_assert(std::is_final<const T>::value, ""); 
    static_assert(std::is_final<volatile T>::value, ""); 
    static_assert(std::is_final<const volatile T>::value, ""); 
} 

template <class T> 
void test_is_not_final() 
{ 
    static_assert(!std::is_final<T>::value, ""); 
    static_assert(!std::is_final<const T>::value, ""); 
    static_assert(!std::is_final<volatile T>::value, ""); 
    static_assert(!std::is_final<const volatile T>::value, ""); 
} 

int main() 
{ 
    test_is_final <P>(); 
    test_is_not_final<P*>();  
    test_is_not_final<U1>(); 
    test_is_not_final<U1*>(); 
    test_is_final <U2>(); // 'std::is_final' on a 'union' with 'final' specifier 
    test_is_not_final<U2*>(); 
} 
0
あなたも同じ事務所から(サードパーティのライブラリを使用している場合があります

、ない書き込みアクセス)はstd::is_final<T>に依存します。一般的な例は、半単位で書かれたシングルトンパターンです。BaseSingletonとDerivedSingletonを並行してインスタンス化することは間違いありません。これを防ぐための悪名高い悪い方法は、std::enable_if<>std::is_final<T>にすることです。したがって、何とかそれを指定できる必要があります。問題は、なぜ組合が最終的に自動的に終わるのではないかということです。

関連する問題