C++ std、tr1和boost(作为名称空间和/或库)之间有什么区别?

C++ std、tr1和boost(作为名称空间和/或库)之间有什么区别?,c++,c++11,boost,tr1,C++,C++11,Boost,Tr1,我起初以为他们都一样,但结果却是错的。那么,有人能简单地解释一下这三者之间的区别吗?例如: < >代码> STD::BIN (最新一个,下一代C++) 代码> STD::Tr1::绑定< /COD>(旧的,C++ STD的扩展) boost::bind(完全独立的库) 或者std::shared_ptr,std::tr1::shared_ptr,以及boost::shared_ptr,…等等 更新 bind,shared_ptr是有助于澄清我的问题的示例。我的目的是了解这三个名称空间之间的一般差

我起初以为他们都一样,但结果却是错的。那么,有人能简单地解释一下这三者之间的区别吗?例如:

< >代码> STD::BIN <代码>(最新一个,下一代C++) 代码> STD::Tr1::绑定< /COD>(旧的,C++ STD的扩展)
  • boost::bind
    (完全独立的库)
  • 或者
    std::shared_ptr
    std::tr1::shared_ptr
    ,以及
    boost::shared_ptr
    ,…等等

    更新

    bind
    shared_ptr
    是有助于澄清我的问题的示例。我的目的是了解这三个名称空间之间的一般差异。这三个名称空间中都有几个库,显然,
    bind
    shared\u ptr
    就是一个例子

    我应该坚持使用什么名称空间?我个人更喜欢从 STD::/COD>库,因为它将是下一个C++标准(C++ 0x)。

    < P> 1是它的标准名称。这将是您用于符合C++11标准的库的名称。所有人的名单

    2 <代码> STD::Tr1::绑定< /COD> >是C++技术报告1命名空间。在C++03和C++11之间有一个新的版本,它提出了额外的库和增强功能。其中大部分在Boost中已经存在,其中一些库更改在C++11标准中采用,如

    (其中包含
    std::bind
    )。
    std::tr1
    名称空间用于区分处于“正在工作”状态的库,而不是
    std
    名称空间中的所有标准化内容

    3-用于
    boost
    命名空间中的
    bind
    ,如果您正在使用库。Boost包含的内容远远超过TR1和C++11的std库中的内容。全部

    TR1中的大部分内容已经标准化,并且位于C++11
    std
    名称空间中,并且C++11包含比TR1中提到的更多的库,这些库是根据Boost构造改编的,如中定义的线程支持


    定义可以使用的内容以及现在可以使用的名称空间的部分内容取决于编译器。我不记得了,但是我认为最近的GCC-g++实现已经开始为新的C++11库使用
    std
    名称空间,但是可能需要一个不同的编译器标志来激活它。不过,它们仍然支持
    std::tr1
    名称空间。Visual C++ 2010将以前在代码> STD::Tr1<代码>中的代码转换成正常的代码> STD< /Calp>命名空间,但是Visual C++ 2008仍然使用了<>代码> STD::Tr1.< /P> < P>不应该有很大的区别,因为下一个C++标准的大部分实际上是从Boost继承的。因此,如果您有
    std::bind
    ,并且不必与其他编译器兼容,只需使用它。
    boost::bind
    对于独立于编译器是很好的选择。我认为,
    std::tr1::bind
    与其他两个选项相比没有任何优势,如果它们可用的话:它对于C++03和C++0x都是非标准的。

    如果您想使用bind(或其他任何选项),一个很好的特性是名称空间重命名,下面是一个示例:

    namespace MyNamespace = boost;
    
    void DoSomething(void)
    {
        MyNamespace::bind( ... );
    }
    
    现在,如果将MyNamespace更改为:

    namespace MyNamespace = std::tr1;
    
    下面使用
    std::tr1::bind

    namespace MyNamespace = std::tr1;
    
    void DoSomething(void)
    {
        MyNamespace::bind( ... );
    }
    

    当然,对于希望在将来轻松更改其名称空间的元素,您应该使用MyNamespace,如果您知道您需要std::tr1,那么您应该直接使用它,而不是别名。

    您的问题中基本上已经有了它。我可以复制/粘贴您的示例并正确回答您的问题。只有两件事需要扩展:

    1) tr1扩展std::的具体方式和原因。TR1是“技术报告1”,是标准委员会下属小组向标准委员会提出的第一套正式的图书馆扩展方案。所以这不仅仅是标准的延伸


    2) 至少在某些系统上,boost::bind的行为实际上与std::bind不同。我不知道这是否符合标准,但在MSVC lambda表达式和std::bind中,它们彼此的行为非常糟糕。也许还有其他一些方法,我不记得了,因为我制定了使用boost::bind而不是std::bind的策略。msvc上的std::bind似乎经常忽略返回值模板参数,因此当您使用
    std::bind(…)
    指定它时,会出现关于没有
    返回值::type
    (或其他)的错误。从来没有费心去弄清楚行为上的确切区别,因为boost::bind已经进入我们的常规词汇表,我们知道如何使用它。

    更改问题-添加“bind”,问题表明您希望在general@peenut,他显然是在问一般的区别。你需要澄清一下。你真的认为有一个
    boost::vector
    boost::cout
    ?你到底想知道什么?@Johannes Schaub:我想知道将军。bind只是我为澄清我的问题而给出的一个例子。我将编辑我的问题。谢谢。@VJo,是的,但我们不要假装它不是C++1x:p@ybungalobill+1让我发笑。:)这些定义是从boost继承的,但代码实现不是这样,我在2009年的tr1::bind中发现了可怕的错误,它甚至不允许您正确地传递ref()。我的感觉是,他们不能只是将boost代码复制到STL实现中,而且它可能是次等的,因为boost代码已经经过了长时间的同行评审和测试,因此我个人没有选择会坚持使用boost。@CashCow:谢谢你的建议。但是VC++中的std::库呢?它们比boost库更糟糕吗?例如boost::regex与std::regex?