Nenhum tipo chamado 'unique_ptr' no namespace 'std' ao compilar sob LLVM / Clang

Estou recebendo um erro de compilação ao tentar usarunique_ptr nas plataformas Apple com-std=c++11:

$ make
c++ -std=c++11 -DNDEBUG -g2 -O3 -fPIC -march=native -Wall -Wextra -pipe -c 3way.cpp
In file included ...
./smartptr.h:23:27: error: no type named 'unique_ptr' in namespace 'std'
    using auto_ptr = std::unique_ptr<T>;
                     ~~~~~^
./smartptr.h:23:37: error: expected ';' after alias declaration
    using auto_ptr = std::unique_ptr<T>;

Segundo Marshall Clow, que considero um especialista naBiblioteca padrão C ++ com Clang e Apple:

O Relatório Técnico nº 1 (TR1) foi um conjunto de adições de bibliotecas ao padrão C ++ 03. Representando o fato de não fazer parte do padrão "oficial", eles foram colocados no espaço de nome std :: tr1.

No c ++ 11, eles são oficialmente parte do padrão e vivem no namespace std, assim como vetor e string. Os arquivos de inclusão também não estão mais na pasta "tr1".

Aprendizado:

Apple e C ++ 03 = usam o espaço para nome TR1Apple e C ++ 11 = usam espaço para nome STDUsarLIBCPP_VERSION detectarlibc++

Agora, aqui está o que eu tenhosmartptr.h:

#include <memory>

// Manage auto_ptr warnings and deprecation in C++11
// Microsoft added template aliases to VS2015
#if (__cplusplus >= 201103L) || (_MSC_VER >= 1900)
  template<typename T>
    using auto_ptr = std::unique_ptr<T>;
#else
  using std::auto_ptr;
#endif // C++11

Eu acho que a última coisa a verificar é a__APPLE__ definir, e aqui está:

$ c++ -x c++ -dM -E - < /dev/null | grep -i apple
#define __APPLE_CC__ 6000
#define __APPLE__ 1
#define __VERSION__ "4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)"
#define __apple_build_version__ 5030040

Por que estou recebendo umerror: no type named 'unique_ptr' in namespace 'std' ao usar-std=c++11?

Eu acho que esses são os quatro casos de teste. Ele tenta exercitar as quatro configurações do produto cruzado de: {C ++ 03, C ++ 11} x {libc ++, libstdc ++}.

c ++ -c test-clapple.cxxEstá bemc ++ -stdlib = libc ++ -c test-clapple.cxxEstá bemc ++ -std = c ++ 11 -c test-clapple.cxxFALHOUc ++ -std = c ++ 11 -stdlib = libc ++ -c test-clapple.cxxEstá bem

Aqui está o driver de teste. Teste-o no OS X para obter todos os efeitos do espaço para nome TR1 em 2015.

$ cat test-clapple.cxx

// c++ -c test-clapple.cxx
// c++ -stdlib=libc++ -c test-clapple.cxx
// c++ -std=c++11 -c test-clapple.cxx
// c++ -std=c++11 -stdlib=libc++ -c test-clapple.cxx

#include <memory>

// Manage auto_ptr warnings and deprecation in C++11
#if (__cplusplus >= 201103L) || (_MSC_VER >= 1900)
  template<typename T>
    using auto_ptr = std::unique_ptr<T>;
#else
    using std::auto_ptr;
#endif // C++11

int main(int argc, char* argv[])
{
    return argc;
}

questionAnswers(1)

yourAnswerToTheQuestion