-std=c++11和-std=gnu++11作为gcc和clang的编译参数有什么区别? 与c99和gnu99同样的问题? 我知道C ++和C标准,这是我感兴趣的参数的差异。 我已经在某个地方看到它与一些扩展有关,但是我不清楚哪些扩展,以及如何在一个新项目中select其中之一。
为什么我应该在实践中更喜欢这个或那个? 什么是技术差异,除了std::thread是一个类?
我一直在阅读关于C99和C ++ 11以及所有这些非常可爱的东西,这些东西已经被添加到语言标准中,可能有一天会很好用。 然而,我们目前在Visual Studio中编写C ++的地方还是陷入困境。 标准中的任何新东西是否会被添加到Visual Studio中?或者,Microsoft是否更愿意添加新的C#变体来实现这一点? 编辑:除了接受的答案,我发现了Visual C ++团队的博客: http://blogs.msdn.com/vcblog/ 具体来说,这个post里面: http://blogs.msdn.com/vcblog/archive/2008/02/22/tr1-slide-decks.aspx 很有用。 谢谢!
声明是什么? return {}; 在C ++ 11中指出,何时使用它而不是(说) return NULL; 要么 return nullptr;
假设我开始一个std::thread ,然后detach()它,所以线程继续执行,即使曾经表示它的std::thread超出了范围。 进一步假定程序没有用于join分离线程1的可靠协议,因此当main()退出时分离的线程仍然运行。 我无法find标准中的任何内容(更准确地说,在N3797 C ++ 14草案中),它描述了应该发生的事情,1.10和30.3都没有包含相关的措词。 1另一个可能相同的问题是:“是否可以再次连接一个分离的线程”,因为无论您正在创build哪个协议,都必须在线程仍在运行时完成信号部分,OS调度器可能决定让线程在信号传输完成后立即睡眠一个小时,而接收端无法可靠地检测到线程实际完成。 如果用分离线程运行的main()运行是未定义的行为,那么除非主线程永不退出,否则任何对std::thread::detach()都是未定义的行为。 因此,运行分离线程的main()运行必须具有已定义的效果。 问题是: 在哪里 (在C ++标准中 ,不是POSIX,不是OS文档,…)是定义的那些效果。 2分离的线程不能被连接( std::thread::join() )。 您可以等待来自分离线程的结果(例如,通过来自std::packaged_task的未来,或通过计数信号量或标志和条件variables),但是不能保证线程已经完成执行 。 事实上,除非将信令部分放入线程的第一个自动对象的析构函数中,否则通常会在信号代码之后运行代码(析构函数)。 如果操作系统安排主线程使用结果,并在分离的线程结束运行析构函数之前退出,那么^ Wis定义了什么?
在复制和交换成语的美丽答案有一段代码,我需要一点帮助: class dumb_array { public: // … friend void swap(dumb_array& first, dumb_array& second) // nothrow { using std::swap; swap(first.mSize, second.mSize); swap(first.mArray, second.mArray); } // … }; 他又加了一张纸条 还有其他的说法,我们应该专门为我们的typesstd :: swap,提供一个在一个自由function交换,一个类交换,但这是不必要的:任何正确使用交换将通过一个非限定的调用,我们的function将通过ADLfind。 一个function就可以了。 和friend我有点“不友好”的说法,我必须承认。 所以,我的主要问题是: 看起来像一个免费的function ,但它的内部类体呢? 为什么不是这个swap静态 ? 它显然不使用任何成员variables。 “任何适当的交换使用将通过ADLfind交换” ? ADL将search命名空间,对吗? 但是,它也看内部类? 或者在这里friend进来? 副题: 用C ++ 11,我应该用noexcept标记我的swap吗? 用C ++ 11和它的范围 ,我应该把friend iter begin()放在friend iter begin()和friend […]
在一个类的赋值操作符中,通常需要检查被赋值的对象是否是调用对象,这样就不会搞砸了: Class& Class::operator=(const Class& rhs) { if (this != &rhs) { // do the assignment } return *this; } 移动赋值操作符需要同样的东西吗? 有没有this == &rhs将是真实的情况? ? Class::operator=(Class&& rhs) { ? }
C ++ 0x引入了unordered_set ,它可以在boost和许多其他地方使用。 我的理解是unordered_set是O(1)查找复杂度的散列表。 另一方面, set只不过是一个log(n)查找复杂度的树。 为什么人们会使用set而不是unordered_set ? 即是否需要set ?
当我使用[=]来指示我希望所有局部variables被lambda中的值捕获时,会导致被复制的函数中的所有局部variables,还是lambda使用的所有局部variables? 所以,例如,如果我有: vector<int> my_huge_vector(100000); int my_measly_int; some_function([=](int i){ return my_measly_int + i; }); 即使我不在lambda中使用它,是否会复制my_huge_vector?
C ++标准委员会倾向于避免将新的关键字添加到语言中,而C ++ 11则不是这种情况。 一些例子: constexpr decltype thread_local auto // New usage noexcept nullptr static_assert alignof alignas C ++ 14中是否引入了新的关键字?