我想通过 -std=c++0x
在 GCC 中启用对 C++0x 的支持。我不一定需要任何 currently supported C++11 features在 GCC 4.5(很快 4.6)中,但我想开始习惯它们。例如,在我使用迭代器的一些地方,auto
类型会很有用。
但同样,我不需要任何当前支持的功能。这里的目标是鼓励我将新标准的特性纳入我的编程“词汇表”。
根据您对 C++11 支持的了解,在 GCC 中启用它是一个好主意,然后通过例如从使用 boost::shared_ptr
切换到std::shared_ptr
因为两者不混合?
PS:我知道 this good question它比较了 shared_ptr
的不同风格,但我要求在标准最终确定之前使用更高级别的建议。另一种说法是,当像 GCC 这样的编译器说它支持“实验性功能”时,这是否意味着我在编译过程中可能会遇到奇怪的错误,这将是主要的时间消耗和 StackOverflow 上神秘问题的来源?
编辑:我决定从 std::shared_ptr
切换回来,因为我只是不相信它在 GCC 4.5 中的支持为 shown by example in this question .
最佳答案
切换到 std::shared_ptr
有几个原因:
- 您删除了对 Boost 的依赖。
- 调试器。根据您的编译器和调试器,调试器可能对
std::shared_ptr
很“智能”,并直接显示指向的对象,而不是说 boost 的实现。至少在 Visual Studio 中,std::shared_ptr
在调试器中看起来像一个普通的指针,而boost::shared_ptr
暴露了一堆 boost 的内部结构。 - 您的链接问题中定义的其他新功能。
您将获得一个几乎可以保证启用移动语义的实现,这可能会节省一些引用计数修改。 (理论上——我自己没有测试过)至少在 2014 年 7 月 22 日,boost::shared_ptr
理解移动语义。(实际上我是正确的。参见 this -- 专门针对std::shared_ptr
在数组类型上正确使用delete []
,而boost::shared_ptr
会导致未定义的行为情况(你必须使用shared_array
或自定义删除器)unique_ptr
的情况,不是shared_ptr
。)
还有一个明显的不这样做的主要理由:
- 您会限制自己使用 C++11 编译器和标准库实现。
最后,您不必选择。 (如果您的目标是特定的编译器系列(例如 MSVC 和 GCC),您可以轻松扩展它以在可用时使用 std::tr1::shared_ptr
。不幸的是,似乎没有检测 TR1 支持的标准方法)
#if __cplusplus > 199711L
#include <memory>
namespace MyProject
{
using std::shared_ptr;
}
#else
#include <boost/shared_ptr.hpp>
namespace MyProject
{
using boost::shared_ptr;
}
#endif
关于c++ - 我应该从使用 boost::shared_ptr 切换到 std::shared_ptr 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6322245/