Tag: c ++ 11

我应该使用shared_ptr还是unique_ptr

我一直在使用pimpl习语做一些对象,但我不确定是否使用std::shared_ptr或std::unique_ptr 。 我明白, std::unique_ptr更有效率,但这对我来说并不是什么大问题,因为无论如何这些对象都是相对重量级的,所以std::shared_ptr超过std::unique_ptr的代价相对较小。 我目前正在与std::shared_ptr只是因为额外的灵活性。 例如,使用std::shared_ptr允许我将这些对象存储在散列表中以便快速访问,同时仍然可以将这些对象的副本返回给调用者(因为我相信任何迭代器或引用可能会很快变得无效)。 然而,这些对象实际上并没有被复制,因为变化会影响到所有的副本,所以我想知道,也许使用std::shared_ptr并允许副本是某种反模式或坏东西。 它是否正确?

如何编写启用ADL的追踪返回types或noexcept规范?

想象一下,我正在写一些容器模板什么的。 而现在是专门为它的std::swap 。 作为一个好公民,我将通过做这样的事情来启用ADL: template <typename T> void swap(my_template<T>& x, my_template<T>& y) { using std::swap; swap(x.something_that_is_a_T, y.something_that_is_a_T); } 这非常整齐。 直到我想添加一个exception规范。 只要T swap被noexcept ,我的swap就是noexcept noexcept 。 所以,我会写这样的: template <typename T> void swap(my_template<T>& x, my_template<T>& y) noexcept(noexcept(swap(std::declval<T>(), std::declval<T>()))) 问题是,在那里swap需要ADL发现swap或std::swap 。 我该如何处理?

Gnu C ++何时会支持C ++ 11而不明确要求?

目前,使用g ++ – 4.8.1,你必须通过C ++ 11模式编译一个文件 g++ -std=c++11 -o prog.x prog.cpp 有没有计划,我可以说 g++ -o prog.x prog.cpp 编译prog.cpp ? 也许prog.cpp有 #include <regex> thread_local class Widget { int member = 5; } MyType operator"" myt(const char*, sze_t); 等等。

当一个exception在multithreadingC ++ 11程序中未处理时会发生什么?

如果我有一个C ++ 11程序运行两个线程,其中一个抛出一个未处理的exception,会发生什么? 整个程序会不会是一场火热的死亡? 请问抛出exception的线程是否会死亡(如果是的话,我能否在这种情况下获得exception)? 还有其他的东西吗?

为什么我不能在lambda中捕获这个引用('&this')?

我理解在lambda中捕获this (修改对象属性)的正确方法如下: auto f = [this] () { /* … */ }; 但是我很好奇以下的特点: class C { public: void foo() { // auto f = [] () { // this not captured auto f = [&] () { // why does this work? // auto f = [&this] () { // Expected ',' before 'this' // […]

是否有任何技巧使用std :: cin来初始化一个constvariables?

常见的std :: cin用法 int X; cin >> X; 这个的主要缺点是X不能是const 。 它可以很容易地引入错误; 我正在寻找一些技巧来创build一个const值,并只写一次。 天真的解决scheme // Naive int X_temp; cin >> X_temp; const int X = X_temp; 你可以通过改变X来const&来改善它。 仍然可以修改原来的variables。 我正在寻找如何做到这一点的简短而巧妙的解决scheme。 我相信我不是唯一能从这个问题的答案中得到好处的人。 //编辑:我想解决scheme很容易扩展到其他types(比方说,所有PODs, std::string和可移动的可复制类与微不足道的构造函数)(如果它没有意义,请让我知道评论)。

C ++ 0x和C ++ 11有什么区别?

我在这里看到这两个术语的混合使用。 维基百科说 C ++ 11,也被称为C ++ 0x … 但我不知道为什么。 为什么它首先被称为C ++ 0x,然后C ++ 11? 另外,x代表什么? 我的猜测 – 像一个variables?

recursionvariables声明

我刚刚在愚蠢/ ManualExecutor.h中看到了这个黑魔法 TimePoint now_ = now_.min(); 在grep了整个库源代码之后,我现在还没有看到variables的定义。 这里发生了什么事? 这是有效的一些recursionvariables声明?

为unique_ptrdynamic投射

正如Boost中的情况一样,C ++ 11提供了一些用于强制shared_ptr函数: std::static_pointer_cast std::dynamic_pointer_cast std::const_pointer_cast 不过,我想知道为什么没有unique_ptr等价函数。 考虑以下简单的例子: class A { virtual ~A(); … } class B : public A { … } unique_ptr<A> pA(new B(…)); unique_ptr<A> qA = std::move(pA); // This is legal since there is no casting unique_ptr<B> pB = std::move(pA); // This is not legal // I would like to do something […]

在初始化列表中使用std :: array

除非我错了,应该可以用这些方法创build一个std:数组: std::array<std::string, 2> strings = { "a", "b" }; std::array<std::string, 2> strings({ "a", "b" }); 然而,使用GCC 4.6.1我无法得到任何这些工作。 编译器只是说: expected primary-expression before ',' token 而初始化列表工作正常与std :: vector。 那是哪个呢? 我误以为std :: array应该接受初始化列表,还是让GNU标准C ++库团队疯狂?