Questions tagged «c++»

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

7
面向经验丰富的C程序员的C ++教程[关闭]
从目前的情况来看,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我专门从事C语言编程已有25年了,但是从未使用过C ++。我现在需要学习C ++编程的基础知识。任何人都可以推荐最适合我的在线教程(如果没有这本书)。谢谢。 编辑:实际上,我实际上纯粹是需要C ++,目的是向一个庞大而古老的C程序中添加几个肮脏的技巧。将整个程序转换为正确编写的OO代码在经济上是完全不可行的。有人批评这些建议的解决方案是基于这样的事实,即它们将引导我走上“成为一名了解C ++的C程序员而又不懂C ++正确精神”的事实,但实际上完全符合我的要求。 编辑:投票最多的答案中的链接现在似乎已断开,但文件似乎存在于多个位置-例如,此处。
69 c++ 

5
为什么std :: map没有const访问器?
std :: map上[]运算符的声明是这样的: T& operator[] ( const key_type& x ); 不是这个原因吗? T& operator[] ( const key_type& x ); const T& operator[] const ( const key_type& x ); 因为这在您每次需要以const方法访问成员映射时都会非常有用。
69 c++  c++11  std 

6
使用属性树在Boost中创建JSON数组
我正在尝试使用boost属性树创建一个JSON数组。 该文档说:“ JSON数组被映射到节点。每个元素都是一个具有空名称的子节点。” 因此,我想用空名称创建一个属性树,然后调用write_json(...)将数组取出。但是,文档没有告诉我如何创建未命名的子节点。我尝试过ptree.add_child("", value),但这会产生: Assertion `!p.empty() && "Empty path not allowed for put_child."' failed 该文档似乎没有解决这一点,至少我无法确定。有人可以帮忙吗?


6
main()在C ++中是否已重载?
中main()存在2个有效版本C++: int main() // version 1 int main(int argc, char **argv) // version 2 但是,两个过载不能同时存在。为什么不?(可能的用例:从终端运行程序时,如果未传递任何参数,则调用第一个版本,否则调用第二个版本。) 编译器是否执行特殊检查以允许每个二进制文件仅允许一个版本?
69 c++  overloading  main 


3
C ++函数中“返回”的确切时刻
这似乎是一个愚蠢的问题,但是return xxx;在一个函数中明确定义“执行”的确切时间吗? 请参见以下示例,以了解我的意思(此处直播): #include <iostream> #include <string> #include <utility> //changes the value of the underlying buffer //when destructed class Writer{ public: std::string &s; Writer(std::string &s_):s(s_){} ~Writer(){ s+="B"; } }; std::string make_string_ok(){ std::string res("A"); Writer w(res); return res; } int main() { std::cout<<make_string_ok()<<std::endl; } 我天真地希望发生的事情make_string_ok称为: 的构造函数res称为(值为resis "A") 的构造函数w称为 return res被执行。应该返回res的当前值(通过复制的当前值res),即"A"。 的析构函数 …

4
为什么构造std :: optional <int>比std :: pair <int,bool>昂贵?
考虑以下两种可以表示“可选int”的方法: using std_optional_int = std::optional&lt;int&gt;; using my_optional_int = std::pair&lt;int, bool&gt;; 鉴于这两个功能... auto get_std_optional_int() -&gt; std_optional_int { return {42}; } auto get_my_optional() -&gt; my_optional_int { return {42, true}; } ... g ++干线和clang ++干线 (带有-std=c++17 -Ofast -fno-exceptions -fno-rtti)都会产生以下汇编: get_std_optional_int(): mov rax, rdi mov DWORD PTR [rdi], 42 mov BYTE PTR [rdi+4], 1 …


1
GCC的-Wpsabi选项到底能做什么?抑制它意味着什么?
背景 去年,我使用了nlohmann json库[1],并且使用GCC 5.x在x86_64上进行了交叉编译arm-linux-gnueabi-*而没有任何警告。当我将GCC更新为较新版本时,GCC会生成含糊的诊断说明页面。例如,这是注释之一 In file included from /usr/arm-linux-gnueabi/include/c++/7/vector:69:0, from include/json.hpp:58, from src/write_hsi.cpp:23: /usr/arm-linux-gnueabi/include/c++/7/bits/vector.tcc: In member function ‘void std::vector&lt;_Tp, _Alloc&gt;::_M_realloc_insert(std::vector&lt;_Tp, _Alloc&gt;::iterator, _Args&amp;&amp; ...) [with _Args = {nlohmann::basic_json&lt;std::map, std::vector, std::__cxx11::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, bool, long long int, long long unsigned int, double, std::allocator, nlohmann::adl_serializer&gt;}; _Tp = nlohmann::basic_json&lt;&gt;; _Alloc = std::allocator&lt;nlohmann::basic_json&lt;&gt; &gt;]’: …
69 c++  linux  gcc  gcc-warning  abi 


8
指针和引用参数之间的区别?
这些是一样的吗: int foo(bar* p) { return p-&gt;someInt(); } 和 int foo(bar&amp; r) { return r.someInt(); } 忽略空指针电位。这两个函数在功能上是否相同,无论someInt()是虚拟的还是传递给bar的子类bar? 这个切片什么吗? bar&amp; ref = *ptr_to_bar;

4
C ++ 17:打开元组时仅保留一些成员
假设您需要调用以下方法: std::tuple&lt;int, int, int&gt; foo(); 在C ++ 17中,您可以调用该函数并在一行中解压缩该元组: auto [a, b, c] = foo(); 现在,我怎么能继续只存储b和c并丢弃a? 目前,我只知道两个选择: 1-自动解压缩时可以使用虚拟变量 但是,哑变量将不被使用,并且会发出警告,因此,如果我想使该警告保持沉默,该代码将非常令人讨厌: #pragma warning(push) #pragma warning(disable:4101) // ReSharper disable once CppDeclaratorNeverUsed auto [_, b, c] = foo(); #pragma warning(pop) 2-我可以存储整个元组,并用于std::get检索对我唯一需要的变量的引用。该代码不太令人讨厌,但语法也不太简单。 此外,对于我们要保留在元组中的每个新值,此代码的大小增加一行。 auto tuple = foo(); int b = std::get&lt;1&gt;(tuple); int c = std::get&lt;2&gt;(tuple); 是否存在另一种更直接的方法来仅将元组中的某些参数解包?
69 c++  tuples  c++17 

2
为什么std :: fill(0)比std :: fill(1)慢?
我在一个系统std::fill上观察到,与恒定值或动态值相比,将恒定值std::vector&lt;int&gt;设置为大时显着且始终较慢:01 5.8 GiB /秒和7.5 GiB /秒 但是,对于较小的数据,结果会有所不同,但fill(0)速度更快: 如果有多个线程,则在4 GiB数据大小下,fill(1)斜率更高,但峰值要低得多fill(0)(51 GiB / s与90 GiB / s): 这就提出了第二个问题,即为什么峰值带宽 fill(1)这么低。 为此的测试系统是双插槽Intel Xeon CPU E5-2680 v3,设置为2.5 GHz(通过/sys/cpufreq),带有8x16 GiB DDR4-2133。我使用GCC 6.1.0(-O3)和Intel编译器17.0.1(-fast)进行了测试,两者均得到相同的结果。GOMP_CPU_AFFINITY=0,12,1,13,2,14,3,15,4,16,5,17,6,18,7,19,8,20,9,21,10,22,11,23被设定。Strem / add / 24线程在系统上的速度为85 GiB / s。 我能够在不同的Haswell双套接字服务器系统上重现这种效果,但在任何其他体系结构上均无法重现。例如,在Sandy Bridge EP上,内存性能是相同的,而在高速缓存fill(0)中则要快得多。 这是要重现的代码: #include &lt;algorithm&gt; #include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;omp.h&gt; #include &lt;vector&gt; using value = …


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.