Questions tagged «c++»

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

3
为什么这称为默认构造函数?
struct X { X() { std::cout << "X()\n"; } X(int) { std::cout << "X(int)\n"; } }; const int answer = 42; int main() { X(answer); } 我本来希望可以打印 X(int),因为X(answer);可以解释为从int到X或 什么也没有,因为X(answer);可以解释为变量的声明。 但是,它打印出来X(),我不知道为什么X(answer);要调用默认构造函数。 优点:要获得临时声明而不是变量声明,我需要更改什么?

5
为什么很多(旧)程序都使用floor(0.5 +输入)而不是round(输入)?
差异在于返回值,我相信这种情况会给平局提供输入,例如以下代码: int main() { std::cout.precision(100); double input = std::nextafter(0.05, 0.0) / 0.1; double x1 = floor(0.5 + input); double x2 = round(input); std::cout << x1 << std::endl; std::cout << x2 << std::endl; } 输出: 1 0 但是最终它们只是不同的结果,一个选择了自己喜欢的一个。我看到许多使用floor(0.5 + input)而不是的“旧” C / C ++程序round(input)。 有什么历史原因吗?最便宜的CPU?
80 c++  rounding  floor 

3
为什么代码会积极尝试阻止尾调用优化?
问题的标题可能有点奇怪,但据我所知,根本没有什么可以反对尾部调用优化。但是,在浏览开源项目时,我已经遇到了一些主动尝试阻止编译器进行尾部调用优化的功能,例如CFRunLoopRef的实现,其中充斥着此类黑客。例如: static void __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__() __attribute__((noinline)); static void __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__(CFRunLoopObserverCallBack func, CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info) { if (func) { func(observer, activity, info); } getpid(); // thwart tail-call optimization } 我很想知道为什么这看起来如此重要,并且在任何情况下我作为普通开发人员都应该牢记这一点吗?例如。尾部调用优化存在常见的陷阱吗?

15
是C ++读写int原子吗?
我有两个线程,一个线程更新一个int,另一个读取它。这是一个统计值,其中读取和写入的顺序无关紧要。 我的问题是,是否仍然需要同步对此多字节值的访问?或者换一种说法,可以完成部分写入并使其中断,然后进行读取。 例如,考虑一个值为0x0000FFFF的值,该值的增量值为0x00010000。 是否有一段时间我应该担心该值看起来像0x0001FFFF?当然,类型越大,越可能发生这种情况。 我一直同步这些类型的访问,但是很好奇社区的想法。

11
为什么不能在另一个函数中定义一个函数?
这不是lambda函数的问题,我知道我可以将lambda分配给变量。 允许我们声明而不在代码内部定义函数的意义何在? 例如: #include <iostream> int main() { // This is illegal // int one(int bar) { return 13 + bar; } // This is legal, but why would I want this? int two(int bar); // This gets the job done but man it's complicated class three{ int m_iBar; public: …

2
在C ++中,空std :: shared_ptr和空std :: shared_ptr有什么区别?
该cplusplus.comshared_ptr页面召唤出一个区分空 std::shared_ptr和空 shared_ptr。该cppreference.com页面没有明确叫出区别,但同时使用“空”,并比较nullptr其描述std::shared_ptr行为。 空和空值之间有区别shared_ptr吗?这种混合行为指针有什么用例?非空nullshared_ptr甚至有意义吗?在正常使用情况下(如果您没有显式构造一个)会出现一个空但非空的情况shared_ptr吗? 如果您使用的是Boost版本而不是C ++ 11版本,这些答案是否会改变?
80 c++  c++11  shared-ptr 

1
更疯狂的精神-解析器类型(规则vs int_parser <>)和元编程技术
问题在底部以粗体显示,该问题在结尾处也用蒸馏代码片段加以概括。 我正在尝试将我的类型系统(类型系统从类型到字符串,从类型到字符串)统一为一个组件(由Lakos定义)。我正在使用boost::array,boost::variant和boost::mpl,以实现此目的。我想将我的类型的解析器和生成器规则统一在一个变量中。有一个未定义的类型,一个int4(见下文)类型和一个int8类型。变体读取为variant&lt;undefined, int4,int8&gt;。 int4特性: struct rbl_int4_parser_rule_definition { typedef boost::spirit::qi::rule&lt;std::string::iterator, rbl_int4()&gt; rule_type; boost::spirit::qi::int_parser&lt;rbl_int4&gt; parser_int32_t; rule_type rule; rbl_int4_parser_rule_definition() { rule.name("rbl int4 rule"); rule = parser_int32_t; } }; template&lt;&gt; struct rbl_type_parser_rule&lt;rbl_int4&gt; { typedef rbl_int4_parser_rule_definition string_parser; }; 上面的变体以未定义开始,然后初始化规则。我遇到了一个问题,该问题导致了50页的错误,我终于设法找到了它,operator=在分配期间使用了Variant ,并且boost::spirit::qi::int_parser&lt;&gt;不能将a分配给另一个(operator =)。 相比之下,我的未定义类型没有问题: struct rbl_undefined_parser_rule_definition { typedef boost::spirit::qi::rule&lt;std::string::iterator, void()&gt; rule_type; rule_type rule; rbl_undefined_parser_rule_definition() { rule.name("undefined parse …

28
为什么要保守地使用例外?
我经常看到/听到人们说例外情况应该很少使用,而永远不要解释原因。尽管这可能是正确的,但基本原理通常是一个轻浮的说法:“由于某种原因,它被称为例外”,在我看来,这似乎是一种受尊敬的程序员/工程师不应接受的解释。 有一系列问题可以使用异常来解决。为什么将它们用于控制流是不明智的?对它们的使用格外保守的背后的哲学是什么?语义学?性能?复杂?美学?惯例? 之前我已经看过一些性能分析,但是分析的水平与某些系统相关,而与其他系统无关。 同样,我不一定不同意在特殊情况下应该保存它们,但是我想知道共识的基础是什么(如果存在这种情况)。
80 c++  exception 

7
为什么需要显式编写'auto'关键字?
我正在从C ++ 98迈向C ++ 11,并且已经熟悉了auto关键字。我想知道为什么我们需要显式声明auto编译器是否能够自动推断类型。我知道C ++是一种强类型语言,这是一条规则,但是如果不显式声明一个变量,auto是否有可能实现相同的结果?
80 c++  c++11  auto 

1
具有相关范围的嵌套模板
在以下错误的上下文中,从属范围是什么,类型名的含义是什么? $ make g++ -std=gnu++0x main.cpp main.cpp:18:10: error: need 'typename' before 'ptrModel&lt;std::vector&lt;Data&gt; &gt;::Type' because 'ptrModel&lt;std::vector&lt;Data&gt; &gt;' is a dependent scope make: *** [all] Error 1 /* * main.cpp */ #include &lt;vector&gt; #include &lt;memory&gt; template&lt;typename T&gt; struct ptrModel { typedef std::unique_ptr&lt;T&gt; Type; }; template&lt;typename Data&gt; struct ptrType { typedef ptrModel&lt; std::vector&lt;Data&gt; …
80 c++  templates  scope  nested 

13
如何在C ++中实现big int
我想在C ++中实现一个大型int类作为编程练习,该类可以处理大于long int的数字。我知道已经有几种开源实现,但是我想写自己的。我正在尝试了解正确的方法是什么。 我知道一般的策略是将数字作为字符串获取,然后将其分解为较小的数字(例如,单个数字),然后将它们放置在数组中。在这一点上,实现各种比较运算符应该相对简单。我主要关心的是如何实现加法和乘法。 我正在寻找一种通用的方法和建议,而不是实际的工作代码。

4
这个结构如何具有sizeof == 0?
有一则旧帖子要求一种sizeof可以返回的结构0。来自高声誉用户的一些高分答案说,按标准,类型或变量的大小不能为0。我同意100%。 但是,有一个新的答案介绍了此解决方案: struct ZeroMemory { int *a[0]; }; 我本来打算对它进行投票和评论,但是在这里花费的时间使我什至可以检查我100%确信的事情。所以......我既惊喜gcc和clang表现出同样的结果:sizeof(ZeroMemory) == 0。更重要的是,变量的sizeof是0: ZeroMemory z{}; static_assert(sizeof(z) == 0); // Awkward... 哇...? Godbolt链接 这怎么可能?

4
不同的编译器调用不同的强制转换运算符
考虑以下简短的C ++程序: #include &lt;iostream&gt; class B { public: operator bool() const { return false; } }; class B2 : public B { public: operator int() { return 5; } }; int main() { B2 b; std::cout &lt;&lt; std::boolalpha &lt;&lt; (bool)b &lt;&lt; std::endl; } 如果在不同的编译器上进行编译,则会得到各种结果。使用Clang 3.4和GCC 4.4.7可以打印true,而Visual Studio 2013可以打印false,这意味着它们在调用不同的强制转换运算符(bool)b。根据标准,哪种行为正确? 以我的理解,operator bool()不需要转换,而operator …

8
Visual Studio 2010奇怪的“警告LNK4042”
我刚刚被Visual Studio 2010(C ++)发出的一些不重要的警告打了头(或几乎没有)。 编译结果如下: 1 Debug \ is.obj:警告LNK4042:对象指定了多次;忽略了其他功能 1 Debug \ make.obj:警告LNK4042:对象指定了多次;忽略了其他功能 1 Debug \ view.obj:警告LNK4042:指定的对象不止一次;额外功能被忽略 1 identity.obj:错误LNK2019:void __cdecl test::identity::view(void)函数void __cdecl test::identity::identity(void)(?identity @ 0test @@ YAXXZ)中引用的未解析外部符号(?view @ identity @ test @@ YAXXZ) 1 identity.obj:错误LNK2019:未解析的外部符号void __cdecl test::identity::make(void)(?make函数void __cdecl test::identity::identity(void)(?identity @ 0test @@ YAXXZ)中引用的@ identity @ test @@ YAXXZ) 1 range.obj:错误LNK2019:void …

16
头文件和库之间有什么区别?
我很难理解的一件事是编译器如何工作。我遇到很多困难,但是特别是我一直在混淆头文件和库。如果有人可以解决问题,那就太好了。
80 c++  c 

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.