2014-01-20 4 views
6

私はissues with the Singleton Patternを認識していますが、C++ 11のメンバー関数指定子を使用してシングルトンを作成してC++ 11について学びました。C++でのシングルトン11メンバー関数の指定子を使用する

とにかく、私はこれまでのところ得た:

#include<new> 
#include<vector> 

class Singleton 
{ 
    private: 
     Singleton() = default; 
     ~Singleton() = default; 

    public: 

     Singleton(const Singleton&) = delete; 
     Singleton& operator=(const Singleton&) = delete; 

     void* operator new(std::size_t) = delete; 
     void* operator new[](std::size_t) = delete; 

     void operator delete(void*) = delete; 
     void operator delete[](void*) = delete; 

     static const Singleton& getInstance() 
     { 
      static Singleton mySingleton; 

      return mySingleton; 
     } 
}; 


int main(int argc, const char *argv[]) 
{ 
    const Singleton& s1 = Singleton::getInstance(); 

    // Why does this compile? 
    std::vector<Singleton> v1; 
    // Or this? 
    std::vector<Singleton> v2(50); 


    return 0; 
} 

そして、私の質問は、これらの行を行う理由:

std::vector<Singleton> v1; 

std::vector<Singleton> v2(50); 

コンパイルし、デフォルトシングルトンのコンストラクタはであることのエラーを報告しません私的な文脈?

私は64ビットLinuxマシンでgcc 4.8.2を使用しています。このコードはhereもコンパイルします。

+0

+1。私はそれがベクトルが空であるが、それはそうではないようだと言いました(http://ideone.com/QEe5SN)。 – Angew

+0

私は質問を編集し、サイズコンストラクタを追加しました。 – tmaric

+1

これは[GCC bug#56429](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56429)で、おそらく[GCC bug#54812](http://gcc.gnu。 org/bugzilla/show_bug.cgi?id = 54812)、これは "FIXED"とマークされています。 – Casey

答えて

0

あなたのコードは、ベクトルが空であるため、getInstanceの外でSingletonのデフォルトのコンストラクタを使用しません。

+0

私は同じことを考えましたが、[この例は](http://ideone.com/QEe5SN)を作りましたが、獣はまだコンパイルされています! – Angew

+0

サイズコンストラクタのバージョンはコンパイルすべきではないと思います。 –

+0

これは実際にOPの質問です - なぜ*コンパイルするのですか? – Angew

関連する問題