草庐IT

c++ - 由于在 C++ 中有两种定义转换的方法,当同一个转换有两种可能性时,它们如何交互?

我只是在寻找有关C++工作原理的说明,这并不是真正要解决我的代码中的特定问题。在C++中,您可以说类型A应该以两种不同的方式隐式转换为类型B。如果您是A的作者,您可以在A中添加如下内容:operatorB(){//code}如果您是B的作者,您可以在B中添加如下内容:B(constA&a){//code}如果我理解正确,其中任何一个都将允许A隐式转换为B。那么如果两者都定义了,使用哪一个?这还允许吗?注意:我知道您可能永远不会遇到这样做的情况。您可以使构造函数显式,或者更有可能只有两者之一。我只是想知道C++规范说了什么,我不知道如何查找。 最佳答案

c++ - C++11 正则表达式中有 match_partial 吗?

我通读了n1429与部分Thealgorithmsregex_matchandregex_searchbothsupportafeaturenotcommonlyseeninregularexpressionlibraries:apartialmatch.Whentheflagstd::regex_constants::match_partialissetintheflagspassedtothealgorithm,thenaresultoftruemaybereturnedifoneormorecharacterswerematched,andthestatemachinethenr

c++ - "-dndebug"(小写)在 g++ 中有什么作用吗?

我正在对使用400行Linux的多平台C++项目进行细微更改makefile几年前别人创造的。makefile中有两行使用-dndebug(小写)作为g++的命令行参数。我认为其目的是定义ndebug符号,但是当它是小写时,该参数甚至会做任何事情吗?我对g++和Make知之甚少,但是,翻页OptionsControllingthePreprocessor,我认为参数需要大写才能起作用。 最佳答案 是的,应该是像这样的大写-DNDEBUG。-D是定义宏的GCC选项。NDEBUG是要定义的宏,以关闭C标准规定的断言。Ihaveminim

c++ - 为什么在 C++ 中有这么多不同的方法来使用 new 运算符

我刚刚阅读了newoperatorexplanationonthecplusplus.com.该页面给出了一个示例来演示使用new运算符的四种不同方式,如下所示://operatornewexample#include#includeusingnamespacestd;structmyclass{myclass(){cout我的问题是:使用的最佳做法是什么新运营商?myclass*p3=newmyclass是否等同于myclass*p3=newmyclass()? 最佳答案 因为他们的目的不同。如果您不希望new在失败时抛出std:

c++ - clang 的 `-Ofast` 选项在实际中有什么作用,特别是对于与 gcc 的任何差异?

类似于的SO问题Whatdoesgcc'sffast-mathactuallydo?并且与Clangoptimizationlevels的SO问题相关,我想知道什么clang的-Ofast优化在实际方面的作用,这些是否与gcc完全不同,或者这是否比编译器更依赖于硬件。根据clang优化级别的公认答案,-Ofast添加到-O3优化:-fno-signed-zeros-freciprocal-math-ffp-contract=fast-menable-unsafe-fp-math-menable-no-nans-menable-no-infs.这似乎完全与float学相关。但是这些优化对

c++ - C++ 中有任何内置的哈希方法吗?

我一直在寻找用于C++的md5,我意识到md5不是内置的(尽管有很多非常好的库支持md5功能)。然后,我意识到我实际上并不需要md5,任何哈希方法都可以。因此,我想知道C++是否有这样的功能?我的意思是,内置哈希函数?当我在研究C++时,我看到Java、PHP和其他一些编程语言支持md5。例如,在PHP中,您只需调用:md5("yourstring");。一个简单的散列函数就可以了。(如果可能,请包括一些关于如何使用它的简单代码。) 最佳答案 这很简单。使用C++11你会得到一个hash仿函数,您可以像这样使用它(未经测试,但给了您

c++ - 为什么在 C++ 中有 delete[]?

为什么会有delete[]?根据我的理解,它对数组的行为有所不同。然而,为什么它真的存在?C中只有free而没有free_array。同样在语法上,deletevar和delete[]var之间的唯一区别是[]没有参数(我不是在告诉数组的长度)。那么为什么delete[]真的存在呢?我知道有人会说你可以重载delete和delete[](至少我认为这是可能的)但可以说我们没有重载它。它为什么存在? 最佳答案 通常,对于非POD类,delete[]表达式必须在编译时无法确定的可变数量的类实例上调用析构函数。编译器通常必须实现一些运行时

c++ - 为什么 C++ 版本的 C 库中有 "c"前缀?

math.h->cmathstdlib.h->cstdlib我理解“.h”版本和“c-prefix”版本之间的区别,但选择使用“c”前缀的原因是什么? 最佳答案 编辑:好的,我们有些人可能没有足够仔细地阅读问题,或者对问题的含义或答案的解释方式做出了假设。我在这里回答以下问题:butwhatwasthereasontochoosetousethe"c"prefix?为了强调它最初来自C语言,我想。 关于c++-为什么C++版本的C库中有"c"前缀?,我们在StackOverflow上找到

c++ - 在 C++11 标准的 §7.3.1.2/3 中有一些我不理解的细节

C++11标准中的§7.3.1.2/3(重点是我的):Everynamefirstdeclaredinanamespaceisamemberofthatnamespace.Ifafrienddeclarationinanonlocalclassfirstdeclaresaclassorfunctionthefriendclassorfunctionisamemberoftheinnermostenclosingnamespace.Thenameofthefriendisnotfoundbyunqualifiedlookup(3.4.1)orbyqualifiedlookup(3.4.3

c++ - std::ref 在此函数中有什么用?

为什么人们更喜欢调用std::ref而不是根本不调用它?templateFfor_each_arg(Ff,Ts&&...a){return(void)initializer_list{(ref(f)((Ts&&)a),0)...},f;//whynotreturn(void)initializer_list{(f((Ts&&)a),0)...},f;} 最佳答案 std::reference_wrapper::operator()在某些情况下,执行一些超出直接函数调用的“魔法”。其效果指定为(引用N4296[refwrap.invo