Questions tagged «c++11»

将此标记用于必须作为C ++ 11编译的代码(不使用C ++ 14或更高版本中引入的任何功能)。

8
优化了“ while(1);” 在C ++ 0x中
更新,请参见下文! 我听说过,C ++ 0x允许编译器为以下代码段打印“ Hello” #include <iostream> int main() { while(1) ; std::cout << "Hello" << std::endl; } 显然,它与线程和优化功能有关。在我看来,这会让很多人感到惊讶。 有人对为什么要允许这样做有很好的解释吗?作为参考,最新的C ++ 0x草案在6.5/5 在for语句的情况下,在for-init-statement之外的循环, 不调用库I / O函数,并且 不访问或修改易失性对象,并且 不执行任何同步操作(1.10)或原子操作(第29条) 实现可能会假定它终止。[注意:这旨在允许编译器进行转换,例如删除空循环,即使无法证明终止也是如此。—尾注] 编辑: 这篇有见地的文章谈到了该标准文本 不幸的是,没有使用“未定义行为”一词。但是,只要该标准说“编译器可以假定P”,就意味着具有not-P属性的程序具有未定义的语义。 这是正确的,并且允许编译器为上述程序打印“ Bye”吗? 这里有一个更具洞察力的线程,它与对C的类似更改有关,由Guy在上面的链接文章中开始。在其他有用的事实中,他们提出了一种似乎也适用于C ++ 0x的解决方案(更新:在n3225上将不再起作用-参见下文!) endless: goto endless; 看来,不允许编译器对其进行优化,因为这不是循环,而是跳转。另一个人总结了C ++ 0x和C201X的拟议更改 通过编写一个循环,程序员断言或者环路不可见的东西的行为(执行I / O,访问volatile对象,或进行同步或原子操作), 或者,它最终会终止。如果我通过写一个没有副作用的无限循环违反了这一假设,那我就是对编译器撒谎,而我的程序的行为是不确定的。(如果幸运的话,编译器可能会警告我。)该语言不提供(不再提供?)一种表达无可见行为的无限循环的方法。 在2011年3月31日更新了n3225:委员会将文本移至1.10 / 24并说 …

7
用c ++ 11等效项替换boost :: thread和boost :: mutex是否明智?
动机:我正在考虑的原因是,我的天才项目经理认为boost是另一种依赖,并且它很可怕,因为“您依赖它”(我试图解释boost的质量,然后过了一段时间就放弃了:( )。我之所以愿意这样做的较小原因是我想学习c ++ 11的功能,因为人们将开始在其中编写代码。 #include<thread> #include<mutex>和Boost等价物之间是否存在1:1映射? 您是否认为用c ++ 11的 东西代替boost的东西是个好主意?我的用法是原始的,但是有没有一些示例说明std不提供什么功能呢?或(亵渎)反之亦然? PS我使用GCC,所以标题在那里。

6
当main()退出时,一个分离的线程会怎样?
假设我先启动一个std::thread,然后启动detach()它,那么即使std::thread那个曾经代表它,但超出范围,线程仍继续执行。 进一步假定该程序不具有用于加入分离线程1的可靠协议,因此分离线程在main()退出时仍然运行。 我无法在标准(更确切地说,在N3797 C ++ 14草案中)中找到任何内容,该标准描述了应该发生的情况,无论1.10还是30.3都没有相关的措辞。 1另一个可能等效的问题是:“是否可以再次连接一个分离的线程”,因为无论您想加入哪种协议,都必须在线程仍在运行时完成信令部分,并且OS调度程序可能决定在执行信令后立即使线程休眠一个小时,而接收端无法可靠地检测到线程实际上已完成。 如果main()用分离的线程运行时耗尽是未定义的行为,则除非主线程永不退出2,否则对的任何使用std::thread::detach()都是未定义的行为。 因此,main()用分离的线程运行时用尽必须具有定义的效果。问题是:在哪里定义了这些效果(在C ++标准中,不是POSIX,不是OS docs,...)。 2分离的线程无法连接(在的意义上std::thread::join())。您可以等待来自分离线程的结果(例如,通过来自的Future std::packaged_task或通过计数信号量或标志和条件变量),但这不能保证线程已完成执行。事实上,除非你把信令部分进入线程的第一个自动对象的析构函数,也将在一般情况下,是代码(析构函数),其运行后的信号代码。如果操作系统安排主线程使用结果并在分离的线程完成运行所述析构函数之前退出,那么将定义发生什么?

6
我为什么要std :: move一个std :: shared_ptr?
我一直在浏览Clang源代码,发现以下代码段: void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = std::move(Value); } 我为什么要std::move一个std::shared_ptr? 在共享资源上转移所有权有什么意义吗? 我为什么不这样做呢? void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = Value; }

1
如果static_cast无效值枚举类会发生什么?
考虑以下C ++ 11代码: enum class Color : char { red = 0x1, yellow = 0x2 } // ... char *data = ReadFile(); Color color = static_cast<Color>(data[0]); 假设data [0]实际上是100。根据标准设置的颜色是什么?特别是如果我以后再做 switch (color) { // ... red and yellow cases omitted default: // handle error break; } 标准是否保证会违约?如果不是,在这里检查错误的正确,最有效,最优雅的方法是什么? 编辑: 作为奖励,标准是否对此做了任何保证,但带有简单的枚举?
146 c++  c++11 

4
在成员函数内部的lambda捕获列表中使用成员变量
以下代码使用gcc 4.5.1编译,但不能使用VS2010 SP1编译: #include <iostream> #include <vector> #include <map> #include <utility> #include <set> #include <algorithm> using namespace std; class puzzle { vector<vector<int>> grid; map<int,set<int>> groups; public: int member_function(); }; int puzzle::member_function() { int i; for_each(groups.cbegin(),groups.cend(),[grid,&i](pair<int,set<int>> group){ i++; cout<<i<<endl; }); } int main() { return 0; } 这是错误: error C3480: 'puzzle::grid': …


1
C ++中“ using”关键字背后的逻辑是什么?
C ++中“ using”关键字背后的逻辑是什么? 它在不同的情况下使用,我正在尝试查找所有这些功能是否具有相同之处,并且有一个原因使用“ using”关键字是有原因的。 using namespace std; // to import namespace in the current namespace using T = int; // type alias using SuperClass::X; // using super class methods in derived class
145 c++  c++11 

7
C ++自动关键字。为什么魔术呢?
从我用来学习C ++的所有材料中,auto一直以来都是一个奇怪的存储期限说明符,没有任何用处。但是就在最近,我遇到了将其本身用作类型名称的代码。出于好奇,我尝试了一下,它假定了我碰巧分配给它的任何类型! 突然地,STL迭代器以及所有使用模板的东西都易于编写10倍。感觉就像我在使用像Python这样的“有趣”语言。 这个关键词在我的一生中都在哪里?您会说这是Visual Studio专用的还是便携式的,从而破坏了我的梦想?
144 c++  types  c++11  auto 


14
在C ++中用auto声明变量是否有缺点?
似乎auto在C ++ 11中添加了相当重要的功能,该功能似乎遵循了许多较新的语言。与Python之类的语言一样,我没有看到任何显式的变量声明(我不确定是否可以使用Python标准)。 使用auto声明变量而不是显式声明变量是否有缺点?


14
C ++ 11中的递归Lambda函数
我是C ++ 11的新手。我正在编写以下递归lambda函数,但无法编译。 sum.cpp #include <iostream> #include <functional> auto term = [](int a)->int { return a*a; }; auto next = [](int a)->int { return ++a; }; auto sum = [term,next,&sum](int a, int b)mutable ->int { if(a>b) return 0; else return term(a) + sum(next(a),b); }; int main(){ std::cout<<sum(1,10)<<std::endl; return 0; } …
143 c++  c++11  lambda 

4
在C ++ 11中,按值传递是否是合理的默认值?
在传统的C ++中,将值传递给函数和方法对于大型对象而言比较慢,并且通常对此不屑一顾。取而代之的是,C ++程序员倾向于传递引用,这虽然更快,但是却引入了与所有权有关的各种复杂问题,尤其是与内存管理有关的问题(在对象是堆分配的情况下) 现在,在C ++ 11中,我们有了Rvalue引用和move构造函数,这意味着可以实现大对象(例如std::vector),而该对象很容易通过值传入和传出函数。 因此,这是否意味着默认值应为诸如std::vector和类型的实例按值传递std::string?定制对象呢?最新的最佳做法是什么?
142 c++  coding-style  c++11 

6
在C ++ 11中用“ auto”推论得出的lambda类型是什么?
我认为lambda的类型是函数指针。当我执行以下测试时,我发现它是错误的(演示)。 #define LAMBDA [] (int i) -> long { return 0; } int main () { long (*pFptr)(int) = LAMBDA; // ok auto pAuto = LAMBDA; // ok assert(typeid(pFptr) == typeid(pAuto)); // assertion fails ! } 上面的代码缺少任何意义吗?如果不是,那么typeof用auto关键字推导的lambda表达式是什么?
141 c++  lambda  c++11  typeof  auto 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.