Questions tagged «c++»

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

4
用G ++编译多线程代码
我有史以来最简单的代码: #include <iostream> #include <thread> void worker() { std::cout << "another thread"; } int main() { std::thread t(worker); std::cout << "main thread" << std::endl; t.join(); return 0; } 尽管我仍然无法编译g++运行它。 更多细节: $ g++ --version g++ (Ubuntu/Linaro 4.8.1-10ubuntu8) 4.8.1 Copyright (C) 2013 Free Software Foundation, Inc. This is free software; see the …
89 c++  linux  ubuntu  gcc  g++ 

3
不赞成使用static关键字…不再吗?
在C ++中,可以static在翻译单元中使用关键字来影响符号(变量或函数声明)的可见性。 在n3092中,已弃用: 附件D.2 [depr.static] 在命名空间范围内声明对象时,不建议使用static关键字(请参阅3.3.6)。 在n3225中,已将其删除。 在我能找到的唯一的文章是有点非正式的。 它确实强调了,为了与C兼容(以及将C程序编译为C ++的能力),弃用是令人讨厌的。但是,直接将C程序编译为C ++可能会令人沮丧,因此我不确定是否值得考虑。 有谁知道为什么要更改?
89 c++  static  c++11  standards 

4
“易失性”的定义是易失性的,还是GCC存在一些标准合规性问题?
我需要一个函数(例如WinAPI中的SecureZeroMemory)始终将内存归零,并且不会被优化,即使编译器认为此后再也不会访问内存了。似乎是挥发物的理想选择。但是我在将其与GCC一起使用时遇到了一些问题。这是一个示例函数: void volatileZeroMemory(volatile void* ptr, unsigned long long size) { volatile unsigned char* bytePtr = (volatile unsigned char*)ptr; while (size--) { *bytePtr++ = 0; } } 很简单。但是,如果您调用GCC实际生成的代码,则随着编译器版本以及您实际上试图将其设置为零的字节数而大不相同。https://godbolt.org/g/cMaQm2 GCC 4.4.7和4.5.3永远不会忽略挥发物。 对于数组大小1、2和4,GCC 4.6.4和4.7.3忽略了volatile。 GCC 4.8.1至4.9.2会忽略数组大小1和2的volatile。 GCC 5.1直到5.3会忽略数组大小1、2、4、8的volatile 对于任何数组大小(一致性的加分点),GCC 6.1都将忽略它。 我测试过的任何其他编译器(clang,icc,vc)都可以生成期望的存储,并且具有任何编译器版本和任何数组大小。所以在这一点上,我想知道,这是一个(相当老而严重的)GCC编译器错误,还是该标准中的volatile定义不精确地表明这实际上是符合规范的行为,因此根本不可能编写可移植的“ SecureZeroMemory”功能? 编辑:一些有趣的观察。 #include <cstddef> #include <cstdint> #include <cstring> #include <atomic> void callMeMaybe(char* …
89 c++  c  gcc  standards 

6
使用类成员的C ++回调
我知道这个问题已经被问过很多次了,因此很难深入研究这个问题,并找到一个简单的可行例子。 我有这个,它很简单,适用于MyClass... #include <iostream> using std::cout; using std::endl; class MyClass { public: MyClass(); static void Callback(MyClass* instance, int x); private: int private_x; }; class EventHandler { public: void addHandler(MyClass* owner) { cout << "Handler added..." << endl; //Let's pretend an event just occured owner->Callback(owner,1); } }; EventHandler* handler; MyClass::MyClass() { …

5
删除指向const的指针(T const *)
我有一个关于const指针的基本问题。我不允许使用const指针调用任何非const成员函数。但是,我可以在const指针上执行此操作: delete p; 这将称为本质上是非常量“方法”的类的析构函数。为什么允许这样做?只是为了支持这一点: delete this; 还是还有其他原因?

6
为什么STL映射不使用[]运算符const?
为了这个问题,有人为的例子: void MyClass::MyFunction( int x ) const { std::cout << m_map[x] << std::endl } 由于[]运算符为非常量,因此无法编译。 不幸的是,因为[]语法看起来很干净。相反,我必须做这样的事情: void MyClass::MyFunction( int x ) const { MyMap iter = m_map.find(x); std::cout << iter->second << std::endl } 这一直困扰着我。为什么[]运算符是非常量的?
89 c++  const 

3
什么是const void?
std::is_void状态描述为: 如果T是类型void,const void,volatile void或const volatile void ,则提供等于true的成员常数值。 那么这可能是const void,或volatile void? 此答案指出const void返回类型将无效(但是在VC ++ 2015上编译) const void foo() { } 如果按照标准,const void是无效的(VC错误),那么什么是const void?
89 c++  c++11  c++14 

3
shared_ptr魔术:)
利德斯特罗姆先生和我有一个论点:) Lidström先生的主张是,构造shared_ptr<Base> p(new Derived);不需要Base具有虚拟析构函数: Armen Tsirunyan:“真的吗?shared_ptr会正确清理吗?在这种情况下,请您演示一下如何实现这种效果?” DanielLidström:“ shared_ptr使用其自己的析构函数来删除Concrete实例。在C ++社区中被称为RAII。我的建议是,您将学习到有关RAII的全部知识。它将使您使用C ++的代码如此容易在任何情况下都可以使用RAII。” Armen Tsirunyan:“我了解RAII,而且我也知道,最终pn达到0时,shared_ptr析构函数可能会删除存储的px。但是,如果px具有指向的静态类型指针Base和动态类型的指针Derived,则除非Base具有虚拟析构函数,否则会导致不确定的行为。如果我做错了,请纠正我。” DanielLidström:“ shared_ptr知道静态类型是Concrete。自从我在其构造函数中传递它以来,它就知道这一点!看起来有点像魔术,但是我可以向您保证,它是设计使然,非常好。” 所以,判断我们。在不要求多态类具有虚拟析构函数的情况下,如何(如果可能)实现shared_ptr?提前致谢

4
如何存储可变参数模板参数?
是否可以以某种方式存储参数包以备后用? template <typename... T> class Action { private: std::function<void(T...)> f; T... args; // <--- something like this public: Action(std::function<void(T...)> f, T... args) : f(f), args(args) {} void act(){ f(args); // <--- such that this will be possible } } 然后稍后: void main(){ Action<int,int> add([](int x, int y){std::cout << (x+y);}, 3, …



1
保证复制清除如何工作?
在2016年Oulu ISO C ++标准会议上,标准委员会将名为“通过简化的值类别进行保证的复制省略”的提案投票选为C ++ 17。 保证的复制清除功能如何工作?它是否涵盖了某些已经允许使用复制消除的情况,还是需要更改代码以保证复制消除?


8
如何解决错误“ Windows SDK 8.1版”?
我最近更新了Visual Studio 2015,现在,当我尝试构建任何项目时,它总是失败并且出现错误 严重性代码说明项目文件行抑制状态错误MSB8036找不到Windows SDK版本8.1。安装所需版本的Windows SDK或在项目属性页中更改SDK版本,或者通过右键单击解决方案并选择“重新定位解决方案”。项目D:\ Program Files(x86)\ Visual Studio 2017 \ Common7 \ IDE \ VC \ VCTargets \ Platforms \ Win32 \ PlatformToolsets \ v141 \ Toolset.targets 34 我按照解决方案重新定向了解决方案,即使重新定向完成了,问题仍然存在。由于这个原因,我决定安装Visual Studio 2017,瞧,它确实做了同样的事情。 7 有什么问题,我该如何解决?

8
如何从Windows注册表读取值
给定某个注册表值的键(例如HKEY_LOCAL_MACHINE \ blah \ blah \ blah \ foo),我该如何: 安全地确定存在这样的密钥。 以编程方式(即使用代码)获得其价值。 我绝对不打算将任何内容写回注册表(如果可以的话,在我的职业生涯中)。因此,如果我不正确地写注册表,我们可以跳过关于体内每个分子以光速爆炸的讲座。 首选C ++的答案,但大多数情况下,您只需要知道特殊的Windows API咒语即可获得该价值。
89 c++  windows  winapi  registry 

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.