草庐IT

c++ - 虚拟析构函数会是一件坏事吗?

我总是用虚拟析构函数标记我的类,即使在不需要时也是如此。除了可能对性能造成小的影响之外,是否会出现这样一种情况:当您不需要虚拟析构函数时会导致内存错误或其他可怕的事情?谢谢 最佳答案 使所有类都可扩展是一个根本缺陷。大多数类根本不适合从中继承,如果您不预先设计用于扩展的类,那么促进这一点是没有意义的。这只是误导了您的API的用户,他们会将此视为该类是有意义的可继承的暗示。实际上,这种情况很少见,并且不会带来任何好处,或者在最坏的情况下会破坏代码。一旦你使一个类可继承,你的余生就注定了:你不能改变它的接口(interface),而且你

c++ - 在 C++ 中, 'Node' 是一个类, 'node' 是 'Node' 的实例。为什么 "*node = nullptr "是错误的,而 "*node = NULL"是正确的?

Node*node;*node=nullptr;报错:error:noviableoverloaded'='*node=nullptr;但是Node*node;*node=NULL;是正确的吗? 最佳答案 NULL很可能是一个旧的宏,继承自C世界,并定义为0。那么在第二种情况下发生的事情是将数字0分配给Node类型的变量。而在第一种情况下,分配了一个指针(nullptr)。编译器肯定知道这是错误的,因为*node不是指针。这意味着它会提示。它是否会提示将数字0分配给Node将取决于Node的赋值运算符是否已过载以接受数字。或者是否存

c++ - 为什么在 C 或 C++ 中使用 "long long"可能是一件坏事?

为什么在C或C++中使用“longlong”可能是一件坏事?前几天我正在编译一个运行时库,在代码中它检查long是否为64位,如果不是,它使用longlong。但除此之外,它还会发出#warning“usinglonglong”。我想不出任何理由将“longlong”作为警告,除非它是开发人员遗留下来的调试问题。谢谢陈茨 最佳答案 据我所知,longlong目前仅在C99中是标准的。它也将是C++0x中的一种类型,但大多数现代编译器应该已经支持它。但是,对于固定大小的整数,可以使用C99header,或者在C++中

c++ - 右值的成员访问运算符应该是一个 xvalue 吗?

在cppreferncesection:Valuecategories,它指出“对象表达式的成员,其中a是右值,m是非引用类型的非静态数据成员”是一个xvalue。在标准中(我在:N4140,thedraftC++14standard中找到)它声明(在第87页)“表达式是一个xvalue,如果它是......一个类成员访问表达式,指定非引用类型的非静态数据成员其中对象表达式是一个xvalue。”我想用下面的代码检查我对此的理解:structB{//BforBoring...inti{0};};templatestructV{V(){coutstructV{//PartialSpecia

c++ - 在 LLVM 中,你如何检查一个 block 是否是一个合并 block

我正在编写一个LLVMPass。我的通行证需要知道哪个block是合并block,即具有多于1个前驱的block。我如何在我的代码中对此进行测试? 最佳答案 您可以像这样遍历所有前辈:#include"llvm/Support/CFG.h"BasicBlock*BB=...;for(pred_iteratorPI=pred_begin(BB),E=pred_end(BB);PI!=E;++PI){BasicBlock*Pred=*PI;//...}你可以使用这个验证一个BB是否有多个前任:BasicBlock*BB=...;if(B

c++ - C++ 预处理器可以判断一个标记是否是一个字符串吗?

预处理器宏是否可以确定其参数是否为字符串(文字)?例如:#defineIS_STRING(token)???IS_STRING("foo")//expandsto1IS_STRING(foo)//expandsto0 最佳答案 是的。但输出略有不同:#defineIS_STRING(token)""token对于字符串文字来说会很好。对于非字符串,它会给出编译器错误。逻辑:编译器自动连接字符串文字,因此如果token是字符串文字,则""token没问题。Hereisarelateddiscussion.

c++ - 保证 std::container::size_type 是一个 std::size_t

正在关注thisquestion,我决定使用std::size_t作为size_type对于每个容器,出于明显的可读性原因。我知道这在理论上是可能的std::container::size_type不是std::size_t,但我认为我当前和future的配置并非如此。但是,为了避免恶意错误,我在使用它们时会检查类型是否相同。例如:BOOST_STATIC_ASSERT(boost::is_same::size_type,std::size_t>::value);std::vectorx;/*fillx*/for(std::size_ti=0;i代码的另一个地方,我使用了一个std::

c++ - 本地类、内部类和嵌套类在C++中是一回事吗?

Localclass、Innerclass和Nestedclass在C++中是同一个意思吗? 最佳答案 本地类和嵌套类是不同的野兽。嵌套类是在另一个类的范围内声明的类。本地类在函数定义中声明。内部类是一个非标准的C++术语,所以我不确定如何定义它。嵌套类:IBM文档作为一个很好的文档here.总结:Thenameofanestedclassislocaltoitsenclosingclass.Unlessyouuseexplicitpointers,references,orobjectnames,declarationsinane

c++ - 从纯虚拟(接口(interface))类虚拟继承是一个很好的约定吗?

我经常使用纯虚类(接口(interface))来减少我当前项目中不同类的实现之间的依赖性。我什至拥有层次结构,其中我有扩展其他纯虚拟类的纯虚拟类和非纯虚拟类,这对我来说并不罕见。这是这种情况的示例:classEngine{/*Declarespurevirtualmethodsonly*/}classRunnableEngine:publicvirtualEngine{/*DefinessomeofthemethodsdeclaredinEngine*/}classRenderingEngine:publicvirtualEngine{/*Declaresadditionalpurev

c++ - const 和 constexpr 最终会是一回事吗?

我刚看了答案constvsconstexpronvariables我正在看这个GoogleTechTalkaboutC++11/14features,其中据说,在函数方面,将来可能不需要constexpr,因为编译器会进化以自行解决。最后,我知道Java编译器和JVM努力找出类(或任何变量可能)在构造后是不可变的-无需您明确说明-并根据这一事实进行各种邪恶的优化。那么,问题来了:const和constexpr的命运最终会是同一件事吗?也就是说,即使编译器不能保证进行运行时初始化等,它最终是否会尽可能(基本上)这样做?当这种情况发生时,其中一个关键字不会是多余的吗?(就像内联正在成为,也