Questions tagged «c++»

C ++是一种通用编程语言。它最初被设计为C的扩展,并且具有类似的语法,但是现在它是一种完全不同的语言。使用此标记可解决有关将要使用C ++编译器编译的代码的问题。对于与特定标准修订版[C ++ 11],[C ++ 14],[C ++ 17]或[C ++ 20]等相关的问题,请使用特定于版本的标记。


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
如何为我的班级提供交换功能?
启用我swap的STL算法的正确方法是什么? 1)会员swap。是否std::swap使用SFINAE技巧来使用成员swap。 2)swap在同一个命名空间中独立。 3)的部分专业化std::swap。 4)以上全部。 谢谢。 编辑:好像我没有清楚地说出我的问题。基本上,我有一个模板类,我需要STL算法才能使用为该类编写的(有效)交换方法。
87 c++  algorithm  stl  swap 

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)。 …

5
为什么C和C ++支持在结构中对数组进行成员分配,但通常不支持?
我了解不支持数组的成员分配,因此以下操作将不起作用: int num1[3] = {1,2,3}; int num2[3]; num2 = num1; // "error: invalid array assignment" 我只是接受这一事实,认为该语言的目的是提供一个开放式框架,并让用户决定如何实现某些功能,例如复制数组。 但是,以下方法确实有效: struct myStruct { int num[3]; }; struct myStruct struct1 = {{1,2,3}}; struct myStruct struct2; struct2 = struct1; 该阵列num[3]是构件明智从它的实例在分配struct1到其实例在struct2。 为什么结构支持数组的成员分配,但通常不支持? 编辑:在结构中std :: string线程中Roger Pate的注释-复制/分配问题?似乎指出了答案的总体方向,但我自己知道的还不够。 编辑2:许多出色的回应。我之所以选择Luther Blissett,是因为我主要想知道该行为背后的哲学或历史原理,但是James McNellis对相关规范文档的引用也很有用。

3
C语言中的long long int vs. long int vs. int64_t
在使用C ++类型特征时,我经历了一些奇怪的行为,并且将我的问题缩小到这个古怪的小问题,由于我不想留下任何可能引起误解的信息,因此我将作大量解释。 假设您有一个像这样的程序: #include <iostream> #include <cstdint> template <typename T> bool is_int64() { return false; } template <> bool is_int64<int64_t>() { return true; } int main() { std::cout << "int:\t" << is_int64<int>() << std::endl; std::cout << "int64_t:\t" << is_int64<int64_t>() << std::endl; std::cout << "long int:\t" << is_int64<long int>() << std::endl; …
87 c++  gcc  cstdint 

3
如何在OpenGL中使用glOrtho()?
我不了解的用法glOrtho。有人可以解释它的用途吗? 是否用于设置xy和z坐标限制的范围? glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); 这意味着x,y和z范围是-1到1?
87 c++  c  opengl 


6
C ++函数模板部分专业化?
我知道下面的代码是类的部分专业化: template <typename T1, typename T2> class MyClass { … }; // partial specialization: both template parameters have same type template <typename T> class MyClass<T,T> { … }; 我也知道C ++不允许函数模板部分专业化(仅允许完全专业化)。但是我的代码是否意味着我已将函数模板部分专门化用于一个/相同类型参数?因为它适用于Microsoft Visual Studio 2010 Express!如果否,那么您能否解释部分专业化概念? #include <iostream> using std::cin; using std::cout; using std::endl; template <typename T1, typename T2> inline T1 max …

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 


1
gcc / g ++:“没有这样的文件或目录”
g++ 给我以下形式的错误: foo.cc:&lt;line&gt;:&lt;column&gt;: fatal error: &lt;bar&gt;: No such file or directory compilation terminated. 使用编译C程序时相同gcc。 这是为什么? 请注意:这个问题已经被问过很多次了,但是每次都针对询问者的情况。这个问题的目的是要提出一个问题,即其他人可以作为的复制品一劳永逸地关闭;一个常见问题。
87 c++  c  gcc  g++  c++-faq 

12
在循环中的什么时候整数溢出会变成未定义的行为?
这是一个示例来说明我的问题,其中涉及一些我无法在此处发布的更复杂的代码。 #include &lt;stdio.h&gt; int main() { int a = 0; for (int i = 0; i &lt; 3; i++) { printf("Hello\n"); a = a + 1000000000; } } 该程序在我的平台上包含未定义的行为,因为a它将在第3个循环中溢出。 这是否会使整个程序具有未定义的行为,还是仅在实际发生溢出之后?编译器是否可以解决a 将导致溢出的问题,以便它可以声明整个循环未定义,并且即使它们都在溢出之前发生,也不必费心运行printfs? (尽管标记为C和C ++有所不同,但如果它们不相同,我会对两种语言的答案都感兴趣。)

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.