Questions tagged «c++»

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

7
const_cast安全吗?
我找不到有关的太多信息const_cast。我可以找到的唯一信息(堆栈溢出)是: 将const_cast<>()用于添加/可变的删除常量(岬)(或挥发性岬)。 这让我感到紧张。可以使用const_cast导致意外行为的行为吗?如果是这样,该怎么办? 或者,什么时候可以使用const_cast?

1
这是什么意思?
我有2节课: class base { virtual void foo() {}; }; class derived : public base { void foo() { base::foo(); } }; 我犯了一个错误,base:foo();而不是写了base::foo();。该代码已编译并运行,但存在段错误。 我不知道该如何使用Google,也不知道它是什么,但是我很感兴趣:这是什么意思? base:foo(); 如果很重要: class base : public QAbstractGraphicsShapeItem
92 c++  syntax 

6
为什么C ++不允许匿名结构?
一些C ++编译器允许匿名联合和结构作为标准C ++的扩展。这是一种语法糖,偶尔会很有帮助。 有什么理由阻止它成为标准的一部分?有技术障碍吗?哲学的?还是只是不足以证明其合理性? 这是我正在谈论的示例: struct vector3 { union { struct { float x; float y; float z; }; float v[3]; }; }; 我的编译器会接受这一点,但警告“无名结构/联合”是C ++的非标准扩展。
92 c++  struct  unions 

12
星号在指针声明中的位置
我最近决定,我只需要最终学习C / C ++,关于指针或更确切地说,它们的定义,我并没有真正了解的一件事。 这些示例如何: int* test; int *test; int * test; int* test,test2; int *test,test2; int * test,test2; 现在,据我所知,前三个案例都在做同样的事情:Test不是一个int,而是一个指向int的指针。 第二组示例比较棘手。在情况4中,test和test2都是指向int的指针,而在情况5中,只有test是指针,而test2是“真实” int。情况6呢?与情况5相同?
92 c++  c  pointers  declaration 


16
C ++中循环移位(旋转)操作的最佳实践
左和右移位运算符(<<和>>)已经在C ++中可用。但是,我找不到如何执行循环移位或旋转操作的方法。 如何执行“向左旋转”和“向右旋转”之类的操作? 在这里向右旋转两次 Initial --> 1000 0011 0100 0010 应导致: Final --> 1010 0000 1101 0000 一个例子会有所帮助。 (编者注:如果C的旋转数为零,或者编译成多个旋转机械指令,则许多用C表示旋转的常见方法都会遭受不确定的行为。此问题的答案应记录最佳实践。)


3
什么时候类型信息在C ++中向后流动?
我刚刚看了斯蒂芬·拉瓦维(Stephan T. Lavavej)在CppCon 2018“类模板参数推论”上的讲话,在某个时候他偶然说: 在C ++类型的信息中,信息几乎永远不会倒退…… 我不得不说“几乎”,因为只有一两种情况,可能更多但很少。 尽管试图弄清楚他可能指的是哪种情况,但我什么也没想出来。因此,问题是: 在哪种情况下,C ++ 17标准要求类型信息向后传播?

2
C ++ 11 Lambda实现和内存模型
我想要一些有关如何正确考虑C ++ 11闭包以及std::function如何实现它们和如何处理内存的信息。 尽管我不相信过早的优化,但我确实有习惯在编写新代码时仔细考虑选择的性能影响。我还进行了大量的实时编程,例如在微控制器和音频系统上,以避免不确定的内存分配/重新分配暂停。 因此,我想更好地理解何时使用或不使用C ++ lambda。 我目前的理解是没有捕获的闭包的lambda就像C回调一样。但是,当通过值或引用捕获环境时,将在堆栈上创建一个匿名对象。当必须从函数返回值闭包时,将其包装在中std::function。在这种情况下,关闭内存会发生什么?它是从堆栈复制到堆吗?每当释放时,std::function就释放它std::shared_ptr吗,也就是说,它是否像引用一样计数? 我想象在一个实时系统中,我可以建立一个lambda函数链,将B作为连续参数传递给A,从而A->B创建处理管道。在这种情况下,A和B闭包将分配一次。虽然我不确定是将它们分配在堆栈还是堆上。但是总的来说,在实时系统中使用它似乎是安全的。另一方面,如果B构造了一些返回的lambda函数C,则C的内存将被重复分配和释放,这对于实时使用是不可接受的。 用伪代码,一个DSP循环,我认为它将是实时安全的。我要执行处理块A,然后执行B,其中A调用其参数。这两个函数都返回std::function对象,因此f将是一个std::function对象,其环境存储在堆中: auto f = A(B); // A returns a function which calls B // Memory for the function returned by A is on the heap? // Note that A and B may maintain a state // via mutable value-closure! for (t=0; …
92 c++  memory  lambda  c++11 

21
将vector <int>转换为字符串
我有一个vector&lt;int&gt;带有整数的容器(例如{1,2,3,4}),我想转换为以下形式的字符串 "1,2,3,4" 在C ++中最干净的方法是什么?在Python中,这就是我的操作方式: &gt;&gt;&gt; array = [1,2,3,4] &gt;&gt;&gt; ",".join(map(str,array)) '1,2,3,4'
92 c++  vector  tostring 

2
如何将list <T>对象附加到另一个对象
在C ++中,我有两个list&lt;T&gt;对象A,B并且想要将的所有成员添加B到的末尾A。我搜索了一些不同的资源,但没有找到一个简单的解决方案(ei A.append(B);),这让我有些惊讶。 做这个的最好方式是什么? 碰巧的是,在此之后我不在乎B(它会在下一行删除),因此,如果有一种方法可以利用它来获得更好的性能,我也对此感兴趣。
92 c++  list  stl 

4
为什么(仅)某些编译器对相同的字符串文字使用相同的地址?
https://godbolt.org/z/cyBiWY 我可以'some'在MSVC生成的汇编代码中看到两个文字,但是只有一个带有clang和gcc。这导致代码执行的结果完全不同。 static const char *A = "some"; static const char *B = "some"; void f() { if (A == B) { throw "Hello, string merging!"; } } 谁能解释这些编译输出之间的区别和相似之处?为什么即使不要求优化,clang / gcc也会优化某些内容?这是某种不确定的行为吗? 我还注意到,如果将声明更改为以下所示,则clang / gcc / msvc根本不会"some"在汇编代码中保留任何声明。为什么行为不同? static const char A[] = "some"; static const char B[] = "some";

7
我如何找到C ++中引发异常的位置?
我有一个程序会在某个地方抛出未捕获的异常。我所得到的只是关于引发异常的报告,而没有关于引发异常的信息。对于编译为包含调试符号而不通知我代码中生成异常的地方的程序,这似乎是不合逻辑的。 有什么办法可以说明我的异常来自哪里,因为没有在gdb中设置“ catch throw”并为每个抛出的异常调用回溯?

6
模板化类中单个方法的模板专业化
始终考虑到至少包含两个.CPP文件的文件包含以下包含我的模板化类的标头,因此此代码可以正确编译: template &lt;class T&gt; class TClass { public: void doSomething(std::vector&lt;T&gt; * v); }; template &lt;class T&gt; void TClass&lt;T&gt;::doSomething(std::vector&lt;T&gt; * v) { // Do something with a vector of a generic T } template &lt;&gt; inline void TClass&lt;int&gt;::doSomething(std::vector&lt;int&gt; * v) { // Do something with a vector of int's } 但是请注意专业化方法中的内联。由于该方法要定义一次以上,因此必须避免链接器错误(在VS2008中为LNK2005)。我了解这一点是因为AFAIK的完整模板专业化与简单方法定义相同。 …


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.