c++-faq相关内容
最近我收到了在我的代码中使用 span 的建议,或者在使用 span 的网站上看到了一些答案 -据说是某种容器.但是 - 我在 C++17 标准库中找不到类似的东西. 那么这个神秘的 span 是什么?为什么(或何时)使用它是非标准的好主意? 解决方案 是什么? A span 是: 对内存中某处 T 类型的连续值序列的非常轻量级的抽象. 基本上是一个 str
..
我正在尝试理解 C++11 的右值引用和移动语义. 这些例子有什么区别,哪些不做向量复制? 第一个例子 std::vector返回向量(无效){std::vectortmp {1,2,3,4,5};返回 tmp;}std::vector&&rval_ref = return_vector(); 第二个例子 std::vector&&返回向量(无效){std::vectortmp
..
我一直在研究 C++11 的一些新特性,我注意到一个是声明变量时的双 & 号,比如 T&&var. 首先,这只野兽叫什么?我希望谷歌允许我们搜索这样的标点符号. 它究竟是什么意思? 乍一看,它似乎是一个双引用(就像 C 风格的双指针 T** var),但我很难想到它的用例. 解决方案 它声明了一个 右值参考(标准提案文档). 这是对右值的介绍参考. 这是微软标
..
好的,所以上次我写 C++ 为生时,std::auto_ptr 是所有可用的 std lib,而 boost::shared_ptr 是所有可用的愤怒.我从未真正研究过 boost 提供的其他智能指针类型.我知道 C++11 现在提供了 boost 提出的一些类型,但不是全部. 那么有人有一个简单的算法来确定何时使用哪个智能指针吗?最好包括关于哑指针(像 T* 这样的原始指针)和其他 boo
..
因为这个问题每周都会被问到,所以这个FAQ可能会帮助很多用户. C++中如何将整数转换为字符串 C++中如何将字符串转换为整数 如何将浮点数转换为 C++ 中的字符串 C++中如何将字符串转换为浮点数 解决方案 C++11 更新 从 C++11 标准开始,字符串到数字的转换(反之亦然)已内置到标准库中. 中包含以下所有函数(根据第 21.5 段). 字符
..
我有一个同名的函数,但在基类和派生类中具有不同的签名.当我尝试在从派生类继承的另一个类中使用基类的函数时,我收到一个错误.看下面的代码: A 类{民众:void foo(string s){};};B类:公共A{民众:int foo(int i){};};C类:公共B{民众:空栏(){字符串 s;foo(s);}}; 我从 gcc 编译器收到以下错误: 在成员函数‘void C::bar()
..
问题 main 函数在 C++ 中的正确签名是什么? 什么是正确的返回类型,从 main 返回一个值是什么意思? 允许的参数类型是什么,它们的含义是什么? 这是特定于系统的吗? 这些规则是否随着时间的推移而改变? 如果我违反了他们会怎样? 解决方案 main 函数必须在全局命名空间中声明为非成员函数.这意味着它不能是类的静态或非静态成员函数,也不能放在命
..
假设我有以下 class X,我想在其中返回对内部成员的访问权限: Z 类{//细节};X级{std::vectorvecZ;民众:Z&Z(size_t 索引){//用于验证索引的大量代码Z&ret = vecZ[索引];//用于确定 Z 实例的更多代码//在索引处 * 恰好 * 是正确的 Z 类型(一个进程//这涉及计算闰年,其中//宗教节日在星期二//未来一千年左右)返回 ret;}cons
..
我想了解外部链接和内部链接以及它们的区别. 我也想知道 const 变量默认在内部链接,除非另外声明为 extern. 解决方案 当您编写实现文件(.cpp、.cxx 等)时,您的编译器会生成一个翻译单元.这是来自您的实现的源文件以及您在其中 #include d 的所有标头. 内部链接是指翻译单元范围内的所有内容. 外部链接是指存在于特定翻译单元之外的事物.换句话
..
在 clang 的 C++11 状态页面中遇到了一个名为“*this 的右值引用"的提议.> 我已经阅读了很多关于右值引用的内容并理解了它们,但我认为我不知道这一点.我也无法使用这些术语在网络上找到太多资源. 页面上有提案文件的链接:N2439(将移动语义扩展到 *this),但我也没有从那里得到太多示例. 这个功能是关于什么的? 解决方案 首先,“ref-qualifier
..
最近,我一直在尝试从本网站学习 C++.不幸的是,每当我尝试运行其中一个代码示例时,我都会看到该程序打开了大约半秒钟,然后立即关闭.有没有办法让程序立即关闭,以便我可以看到我的努力成果? 解决方案 编辑: 正如 Charles Bailey 在下面的评论中正确指出的那样,如果 stdin,而且真的没有什么好的方法可以解决这个问题.如果您使用附加调试器运行,John Dibling 建议的解
..
以下短语在 C++ 中的含义是什么: 零初始化, 默认初始化,以及 值初始化 C++ 开发人员应该了解什么? 解决方案 需要意识到的一件事是“值初始化"是 C++ 2003 标准的新特性——它在 1998 年的原始标准中不存在(我认为它是可能是唯一不仅仅是澄清的区别).请参阅 KirillV. Lyadvinsky 对直接来自标准的定义的回答. 请参阅有关 o
..
正如我最近发布的这个答案所示,我似乎对 volatile 在多线程编程上下文中的实用性(或缺乏)感到困惑. 我的理解是:任何时候一个变量可能在访问它的一段代码的控制流之外被改变,该变量应该被声明为volatile.信号处理程序、I/O 寄存器和被另一个线程修改的变量都构成了这种情况. 因此,如果您有一个全局 int foo,并且 foo 由一个线程读取并由另一个线程自动设置(可能使用适
..
我遇到了这个奇怪的代码片段,它编译得很好: class Car{民众:国际速度;};int main(){int Car::*pSpeed = &Car::speed;返回0;} 为什么 C++ 有指向类的非静态数据成员的 this 指针?这个奇怪的指针在实际代码中有什么用? 解决方案 它是一个“指向成员的指针"——下面的代码说明了它的用法: #include 使用命名空间标准;类车
..
我无法理解 std::string 和 std::wstring 之间的区别.我知道 wstring 支持宽字符,例如 Unicode 字符.我有以下问题: 我什么时候应该使用 std::wstring 而不是 std::string? std::string 能否保存整个 ASCII 字符集,包括特殊字符? 所有流行的 C++ 编译器都支持 std::wstring 吗? 什么是“宽
..
有人带来了这篇文章 我注意到声称(我在意译) STL 术语被误用于指代整个 C++ 标准库,而不是取自 SGI STL 的部分. (...) 它指的是“STL",尽管事实上很少有人仍然使用 STL(它是在 SGI 设计的). C++ 标准库的部分内容基于 STL 的部分内容,正是这些部分被许多人(包括几位作者和臭名昭著的错误缠身的 cplusplus.com)称为“STL".然而,
..
const 在这样的声明中是什么意思?const 让我很困惑. class foobar{民众:运算符 int() const;const char* foo() const;}; 解决方案 当您将 const 关键字添加到方法中时,this 指针实际上将变成一个指向 const 对象,因此您不能更改任何成员数据.(除非您使用 mutable,否则稍后会详细介绍). const 关键字
..
在完美转发中,std::forward 用于将命名的右值引用 t1 和 t2 转换为未命名的右值引用.这样做的目的是什么?如果我们离开 t1 & 这将如何影响被调用的函数 innert2 作为左值? template 空外(T1&& t1, T2&& t2){内部(std::forward(t1),std::forward(t2));} 解决方案 你必须了解转发问题.您可以详细阅读整个问题,
..
我编写了一个简单的俄罗斯方块游戏,其中每个块都是单块类的一个实例. class SingleBlock{民众:SingleBlock(int, int);~单块();整数 x;输入 y;SingleBlock *next;};类多块{民众:多块(整数,整数);单块 *c, *d, *e, *f;};SingleBlock::SingleBlock(int a, int b){x = 一个;y =
..
我经常听到在编译 C 和 C++ 程序时我应该“始终启用编译器警告".为什么这是必要的?我怎么做? 有时我也听说我应该“将警告视为错误".我是不是该?我该怎么做? 解决方案 为什么要启用警告? C 和 C++ 编译器在报告一些常见的程序员错误默认方面是出了名的糟糕,例如: 忘记初始化变量 忘记从函数中返回一个值 printf 和 scanf 系列中的参数与格式字符串不
..