Questions tagged «c++11»

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

4
现代C ++的实验功能对长期项目是否可靠?
我有一个当前使用C ++ 11/14的项目,但是它需要类似的东西std::filesystem,它仅在C ++ 17中可用,因此我目前没有机会使用它。但是,我看到它在我当前的编译器中可用std::experimental::filesystem。使用实验性功能是否是一个好主意,假设我将来可以添加以下内容: #ifdef CXX17 //if this is C++17 std::filesystem::something ...; #else std::experimental::filesystem::something ...; #endif 我担心的是: 1.是否保证所有兼容的编译器都具有相同的实验功能? 2.实验功能是否容易发生重大变化而使其不可靠? 也许还有更多事情想知道。为什么我应该或不应该使用它们?我为一个新项目感到困惑,不知道该怎么决定。


6
普通数组如何基于范围工作?
在C ++ 11中,您可以使用基于范围的for,它foreach与其他语言一样。它甚至适用于纯C数组: int numbers[] = { 1, 2, 3, 4, 5 }; for (int& n : numbers) { n *= 2; } 它怎么知道什么时候停止?它仅适用于在相同范围内声明的静态数组for吗?您如何for在动态数组中使用它?
87 c++  arrays  foreach  c++11 


3
C ++ 11允许非静态和非const成员的类内初始化。发生了什么变化?
在C ++ 11之前,我们只能对整数或枚举类型的静态const成员执行类内初始化。Stroustrup在他的C ++ FAQ中对此进行了讨论,并给出了以下示例: class Y { const int c3 = 7; // error: not static static int c4 = 7; // error: not const static const float c5 = 7; // error: not integral }; 并进行以下推理: 那么为什么存在这些不便的限制呢?通常在头文件中声明类,并且通常将头文件包含在许多翻译单元中。但是,为避免复杂的链接器规则,C ++要求每个对象都有唯一的定义。如果C ++允许在类中定义需要作为对象存储在内存中的实体,则该规则将被打破。 但是,C ++ 11放宽了这些限制,允许对非静态成员进行类内初始化(第12.6.2 / 8节): 在非委托构造函数中,如果给定的非静态数据成员或基类未由mem-initializer-id指定(包括由于构造函数没有ctor-initializer而没有mem-initializer-list的情况)并且该实体不是抽象类(10.4)的虚拟基类,则 如果实体是具有brace-or-equal-initializer的非静态数据成员,则按照8.5中的指定进行初始化; 否则,如果实体是变量成员(9.5),则不执行初始化。 否则,该实体为默认初始化(8.5)。 …

8
C ++ 11 vector <struct>上的emplace_back?
考虑以下程序: #include &lt;string&gt; #include &lt;vector&gt; using namespace std; struct T { int a; double b; string c; }; vector&lt;T&gt; V; int main() { V.emplace_back(42, 3.14, "foo"); } 它不起作用: $ g++ -std=gnu++11 ./test.cpp In file included from /usr/include/c++/4.7/x86_64-linux-gnu/bits/c++allocator.h:34:0, from /usr/include/c++/4.7/bits/allocator.h:48, from /usr/include/c++/4.7/string:43, from ./test.cpp:1: /usr/include/c++/4.7/ext/new_allocator.h: In instantiation of ‘void __gnu_cxx::new_allocator&lt;_Tp&gt;::construct(_Up*, _Args&amp;&amp; …
87 c++  c++11 


4
为什么const成员函数可以修改静态数据成员?
在以下C++程序中,从函数修改静态数据成员const可以正常工作: class A { public: static int a; // static data member void set() const { a = 10; } }; 但是从函数修改非静态数据成员const不起作用: class A { public: int a; // non-static data member void set() const { a = 10; } }; 为什么const成员函数可以修改static数据成员?
86 c++  function  c++11  static  const 

4
我可以在Xcode中使用C ++ 11吗?
我正在考虑auto在某些跨平台项目(Windows + Mac)中使用某些C ++ 11功能(例如)。在Windows上,Visual Studio支持即将到来的C ++ 11标准的某些部分,这将使我能够简化部分代码库,因此自然而然地,我将有兴趣开始使用这些功能。 但是据我所知,当前的XCode版本(3.2.4 + GCC 4.2)根本不支持任何C ++ 11功能。我可以以某种方式升级GCC版本或CLang版本吗?还是我应该只咬一口舌头,等待苹果在将来的某个时候打包新版本?
86 c++  xcode  gcc  c++11  clang 

10
漂亮打印std :: tuple
这是我先前关于漂亮打印的STL容器的问题的跟进,我们设法为其开发了一个非常优雅且完全通用的解决方案。 在接下来的步骤中,我想std::tuple&lt;Args...&gt;使用可变参数模板(严格来说是C ++ 11)进行的漂亮打印。对于std::pair&lt;S,T&gt;,我只是说 std::ostream &amp; operator&lt;&lt;(std::ostream &amp; o, const std::pair&lt;S,T&gt; &amp; p) { return o &lt;&lt; "(" &lt;&lt; p.first &lt;&lt; ", " &lt;&lt; p.second &lt;&lt; ")"; } 打印元组的类似结构是什么? 我尝试了各种形式的模板参数堆栈拆包,传递索引并使用SFINAE来发现何时到达最后一个元素,但是没有成功。我不会因我的代码破译而使你负担重;希望问题描述很简单。本质上,我想要以下行为: auto a = std::make_tuple(5, "Hello", -0.1); std::cout &lt;&lt; a &lt;&lt; std::endl; // prints: (5, "Hello", -0.1) 包括与上一个问题相同级别的通用性(char / wchar_t,对定界符)的加分点!


5
了解C ++ 11中的std :: atomic :: compare_exchange_weak()
bool compare_exchange_weak (T&amp; expected, T val, ..); compare_exchange_weak()是C ++ 11中提供的比较交换原语之一。即使对象的值等于,它也返回false,这是弱的expected。这是由于在某些平台上使用了一系列指令(而不是x86上的指令)来实现它的虚假故障所致。在这样的平台上,上下文切换,另一个线程重新加载相同的地址(或缓存行)等可能会使原语失败。这是spurious因为它不是所述对象(不等于的值expected失败的操作)。相反,这是一种时间问题。 但令我感到困惑的是C ++ 11标准(ISO / IEC 14882)中所说的内容, 29.6.5 ..伪失败的后果是几乎所有弱比较和交换的使用都将循环。 为什么几乎在所有用途中它都必须处于循环状态?这是否意味着我们会在由于虚假故障而失败时循环?如果是这样,为什么我们还要compare_exchange_weak()自己动手使用和编写循环?我们可以使用compare_exchange_strong()我认为应该为我们消除虚假故障的方法。常见的用例是compare_exchange_weak()什么? 另一个问题有关。安东尼在他的《行动中的C ++并发性》一书中说: //Because compare_exchange_weak() can fail spuriously, it must typically //be used in a loop: bool expected=false; extern atomic&lt;bool&gt; b; // set somewhere else while(!b.compare_exchange_weak(expected,true) &amp;&amp; !expected); //In this case, you …

13
C ++ volatile关键字是否引入了内存屏障?
我了解这会volatile告知编译器该值可能会更改,但是为了完成此功能,编译器是否需要引入内存隔离墙以使其起作用? 据我了解,对易失对象的操作顺序不能重新排序,必须保留。这似乎意味着需要一些内存隔离,并且实际上没有解决方法。我说的对吗? 有关这个问题有一个有趣的讨论 乔纳森·韦克利(Jonathan Wakely)写道: ...对不同的volatile变量的访问,只要它们出现在单独的完整表达式中,就无法重新排序...对,volatile对于线程安全性是无用的,但并非出于其给出的原因。这不是因为编译器可能会重新排列对易失性对象的访问,而是因为CPU可能会重新排列对易失性对象的访问。原子操作和内存屏障可防止编译器和CPU重新排序 到大卫·施瓦茨回答的评论: 从C ++标准的角度来看,在编译器执行某些操作和编译器发出导致硬件执行某些操作的指令之间没有区别。如果CPU可以重新排序对易失性的访问,则该标准不需要保留其顺序。... ... C ++标准对重新排序没有任何区别。而且您不能说CPU可以对它们进行重新排序而不会产生可观察的效果,所以没关系-C ++标准将它们的顺序定义为可观察的。如果编译器生成使平台执行标准要求的代码,则它符合平台上的C ++标准。如果该标准要求对挥发物的访问不进行重新排序,那么重新排序它们的平台将不兼容。... 我的观点是,如果C ++标准禁止编译器对不同的volatile进行重新排序,那么从理论上讲,此类访问的顺序是程序可观察到的行为的一部分,那么它还要求编译器发出禁止CPU执行的代码所以。该标准没有区分编译器做什么和编译器生成的代码使CPU做什么。 哪个产生两个问题:它们中的一个是“正确的”吗?实际的实现实际上是做什么的?

4
C ++ 11 thread_local变量是否自动静态?
这两个代码段之间是否有区别: void f() { thread_local vector&lt;int&gt; V; V.clear(); ... // use V as a temporary variable } 和 void f() { static thread_local vector&lt;int&gt; V; V.clear(); ... // use V as a temporary variable } 背景知识:最初,我有一个STATIC向量V(用于保存一些中间值,每次输入函数时都会清除它)和一个单线程程序。我想将程序变成一个多线程程序,因此我必须摆脱这种静态修饰符。我的想法是将每个静态变量都转换为thread_local,而不用担心其他事情?这种做法会适得其反吗?

2
具有已构建对象的std :: move与emplace_back()的C ++ 11 push_back()效率
在C ++ 11emplace_back()中(就效率而言)通常更可取,push_back()因为它允许就地构造,但是当push_back(std::move())与已经构造的对象一起使用时,仍然是这种情况吗? 例如,emplace_back()在以下情况下还是首选? std::string mystring("hello world"); std::vector&lt;std::string&gt; myvector; myvector.emplace_back(mystring); myvector.push_back(std::move(mystring)); // (of course assuming we don't care about using the value of mystring after) 另外,在上面的示例中代替这样做有什么好处: myvector.emplace_back(std::move(mystring)); 还是此举完全是多余的,还是没有效果?

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.