Questions tagged «c++»

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

8
Lambda捕获作为const参考吗?
是否可以通过const引用在Lambda表达式中捕获? 我希望下面标记的作业失败,例如: #include <cstdlib> #include <vector> #include <string> #include <algorithm> using namespace std; int main() { string strings[] = { "hello", "world" }; static const size_t num_strings = sizeof(strings)/sizeof(strings[0]); string best_string = "foo"; for_each( &strings[0], &strings[num_strings], [&best_string](const string& s) { best_string = s; // this should fail } ); return …
166 c++  c++11  lambda  c++14 

2
查明“条件跳转或移动取决于未初始化的值” valgrind消息
因此,我从valgrind那里得到了一些神秘的未初始化的值消息,关于错误值的起源一直是个谜。 似乎valgrind显示的是最终使用统一值的位置,而不是未初始化值的来源。 ==11366== Conditional jump or move depends on uninitialised value(s) ==11366== at 0x43CAE4F: __printf_fp (in /lib/tls/i686/cmov/libc-2.7.so) ==11366== by 0x43C6563: vfprintf (in /lib/tls/i686/cmov/libc-2.7.so) ==11366== by 0x43EAC03: vsnprintf (in /lib/tls/i686/cmov/libc-2.7.so) ==11366== by 0x42D475B: (within /usr/lib/libstdc++.so.6.0.9) ==11366== by 0x42E2C9B: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_float<double>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, char, …
166 c++  valgrind 


1
静态成员函数错误;如何正确签名?
尝试使用当前签名在g ++中编译代码时出现错误: cannot declare member function static void Foo::Bar(std::ostream&, const Foo::Node*) to have static linkage 我的问题是双重的: 为什么不这样编译? 什么是正确的签名,为什么? 使用C ++时签名始终是我的死 编辑:这也是类头文件: class Foo { public: Foo(); ~Foo(); bool insert(const Foo2 &v); Foo * find(const Foo2 &v); const Foo * find(const Foo2 &v) const; void output(ostream &s) const; private: //Foo(const Foo …

9
为什么在多线程C或C ++编程中不认为volatile有用?
正如我最近发布的答案所表明的那样,我似乎对volatile多线程编程上下文中的实用程序(或缺少实用程序)感到困惑。 我的理解是:只要变量可以在访问代码的控制流之外更改,则该变量应声明为volatile。信号处理程序,I / O寄存器以及由另一个线程修改的变量都构成了这种情况。 因此,如果您有一个全局int foo,并且foo被一个线程读取,并由另一个线程自动设置(可能使用适当的机器指令),则读取线程会以这种方式看到这种情况,就像看到一个由信号处理程序或由外部硬件条件修改,因此foo应声明volatile(或在多线程情况下,以内存限制的负载访问,这可能是一个更好的解决方案)。 我怎么在哪里错?


11
在实践中真的使用了pImpl成语吗?
我正在阅读Herb Sutter撰写的“ Exceptional C ++”一书,在那本书中,我了解了pImpl习惯用法。基本上,该想法是为a的private对象创建一个结构class并动态分配它们以减少编译时间(并以更好的方式隐藏私有实现)。 例如: class X { private: C c; D d; } ; 可以更改为: class X { private: struct XImpl; XImpl* pImpl; }; 以及在CPP中的定义: struct X::XImpl { C c; D d; }; 这似乎很有趣,但是我以前从未见过这种方法,无论是在我工作的公司还是在看过源代码的开源项目中,我都从未见过。因此,我想知道这种技术是否真的在实践中使用? 我应该在任何地方使用它还是要谨慎使用?是否建议将此技术用于性能非常重要的嵌入式系统?
165 c++  oop  pimpl-idiom 

11
指向子类的指针上的delete是否调用基类的析构函数?
我有一个class A使用堆内存分配为其字段之一。类A被实例化并作为指针字段存储在另一个类(class B。 当我完成了类B的对象时,我会调用delete,我假设它调用了析构函数...但是这是否也调用了类A的析构函数? 编辑: 从答案中,我认为(如果不正确,请编辑): delete B实例的调用B ::〜B(); 哪个电话 A::~A(); A::~A 应该显式地deleteA对象的所有堆分配的成员变量; 最终,将存储该类B实例的内存块返回到堆-当使用new时,它首先在堆上分配一个内存块,然后调用构造函数对其进行初始化,现在在所有析构函数都被调用以最终确定对象之后对象所在的块返回到堆。

14
如何调试堆损坏错误?
我正在Visual Studio 2008下调试(本机)多线程C ++应用程序。在看似随机的情况下,出现“ Windows触发了断点...”错误,并指出这可能是由于堆。这些错误不会总是立即使应用程序崩溃,尽管可能会在不久后崩溃。 这些错误的最大问题是它们仅在损坏发生后才弹出,这使得它们很难跟踪和调试,尤其是在多线程应用程序上。 什么样的事情会导致这些错误? 如何调试它们? 欢迎使用提示,工具,方法,启示...。
165 c++  windows  debugging  heap 

9
Windows(Visual C)是否可以替代unistd.h?
我正在将一个为Unix编写的相对简单的控制台程序移植到Windows平台(Visual C ++ 8.0)。所有源文件都包含“ unistd.h”,该文件不存在。删除它,我会抱怨缺少“ srandom”,“ random”和“ getopt”的原型。我知道我可以替换随机函数,而且我很确定自己可以找到/破解一个getopt实现。 但是我敢肯定,其他人也会遇到同样的挑战。我的问题是:Windows是否有“ unistd.h”端口?至少有一个包含本机Windows实现的功能-我不需要管道或分支。 编辑: 我知道我可以创建自己的“ unistd.h”,其中包含我需要的东西的替代品-特别是在这种情况下,因为这是一个有限的集合。但是由于这似乎是一个常见问题,所以我想知道是否有人已经为更大的功能子集完成了工作。 在工作中无法切换到其他编译器或环境-我对Visual Studio感到困惑。
165 c++  c  windows  portability  unistd.h 

3
为什么我应该避免在函数签名中使用std :: enable_if
Scott Meyers发布了他的下一本书EC ++ 11的内容和状态。他写道,书中的一项可能是“避免std::enable_if使用函数签名”。 std::enable_if 可用作函数参数,返回类型或类模板或函数模板参数,以有条件地从重载解析中删除函数或类。 在此问题中,显示了所有三种解决方案。 作为功​​能参数: template<typename T> struct Check1 { template<typename U = T> U read(typename std::enable_if< std::is_same<U, int>::value >::type* = 0) { return 42; } template<typename U = T> U read(typename std::enable_if< std::is_same<U, double>::value >::type* = 0) { return 3.14; } }; 作为模板参数: template<typename T> struct …

15
实际上,为什么不同的编译器会计算int x = ++ i + ++ i;的不同值?
考虑以下代码: int i = 1; int x = ++i + ++i; 我们假设编译器对此代码可能进行编译时有一些猜测。 两者都++i返回2,导致x=4。 一个++i返回2,另一个返回3,导致x=5。 两者都++i返回3,导致x=6。 在我看来,第二次出现的可能性最大。使用++运算符执行两个运算符之一i = 1,将i其递增,然后2返回结果。然后,使用++来执行第二个运算符i = 2,将i递增,并3返回结果。然后2与3加在一起得到5。 但是,我在Visual Studio中运行了这段代码,结果是6。我试图更好地理解编译器,并且想知道什么可能导致的结果6。我唯一的猜测是代码可以通过一些“内置”并发执行。++调用了两个运算符,每个运算符i在另一个返回之前先递增,然后都返回3。这将与我对调用堆栈的理解相矛盾,因此需要加以解释。 C++编译器可能会执行哪些(合理的)操作,从而导致结果4或结果或6? 注意 该示例在Bjarne Stroustrup的《编程:使用C ++的原理和实践》中作为未定义行为的示例出现。 参见肉桂的评论。

20
“ for(;;)”比“ while(TRUE)”更快吗?如果没有,人们为什么要使用它?
for (;;) { //Something to be done repeatedly } 我已经看到这种东西使用了很多,但是我觉得这很奇怪……说起来不是那么清晰while(true),或者类似的话吗? 我猜想(这是许多程序员诉诸密码的原因),这快一点点吗? 为什么,真的值得吗?如果是这样,为什么不这样定义呢? #define while(true) for(;;) 另请参阅:哪个更快:while(1)或while(2)?

12
C ++ for循环之前从未见过
我正在将C ++算法转换为C#。我遇到了这个for循环: for (u = b.size(), v = b.back(); u--; v = p[v]) b[u] = v; 它在C ++中没有错误,但在C#中却没有(无法将int转换为bool)。我真的不知道这个for循环,条件在哪里? 有人可以解释一下吗? PS。只是检查一下,以使VECTOR适应LIST,b.back()是否对应于b [b.Count-1]?
164 c#  c++  for-loop 

5
为什么不能使用双冒号在名称空间中向前声明一个类?
class Namespace::Class; 为什么我必须这样做?: namespace Namespace { class Class; } 使用VC ++ 8.0时,编译器会出现以下问题: 错误C2653:“名称空间”:不是类或名称空间名称 我认为这里的问题是编译器无法判断Namespace类还是名称空间?但是为什么这很重要,因为它只是一个前向声明? 有没有其他方法可以向前声明在某些名称空间中定义的类?上面的语法就像我在“重新打开”命名空间并扩展其定义一样。如果Class未在中定义Namespace怎么办?在某个时候会导致错误吗?
164 c++  namespaces 

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.