草庐IT

c++ - 是否需要 C++ 中的#includes 的特定顺序是不良库/头文件设计的标志?

我使用过一些非常大规模的系统,但从未见过需要的订单,但最近遇到了。STL或STD库甚至Boost是否存在某些包含必须按特定顺序出现的情况? 最佳答案 DoestheSTLorSTDlibraryorevenBoosthaveanycaseswherecertainincludesmustcomeinacertainorder?对于标准,答案很明确,否。我想Boost也是如此,虽然我没有查过。来自C标准:Standardheadersmaybeincludedinanyorder;eachmaybeincludedmorethanon

c++ - 这些转换中的哪些应该是不明确的?

我有一些像下面这样的代码:classbar;classfoo{public:operatorbar()const;};classbar{public:bar(constfoo&foo);};voidbaz(){foof;barb=f;//[1]constfoof2;barb2=f2;//[2]}GCC在[2]但不是[1]处给出错误。Clang两者都出错,显然MSVC两者都出错。谁是对的? 最佳答案 tl;博士暧昧。(另外,如果你停在tl;dr,那么language-lawyer标签可能不是你的一杯茶。^_^)剧透两位候选人都有一个c

c++ - 将函数的返回类型声明为T&&是不是没有意义?

众所周知,在大多数情况下,T&&的意思是“这是一个临时对象”。但是,如果想要从函数中返回一个临时对象,他/她可以将函数声明如下:templateTf(){Tt;......returnt;}或(注:不正确)templateT&&f(){Tt;......returnt;}但我认为后者有点过头了,因为前者已经足够了,并且向后兼容。然而,我也发现std::forward()的返回类型被声明为T&&,所以我确信我对此的理解是不完整的。我真正的问题是:我们应该在何时何地将函数的返回类型声明为T&&? 最佳答案 在您的示例中,T&&是错误的,

c++ - 我认为数组是不可复制的

我的印象是数组不可复制(或可分配)。intx[5]={1,2,3,4,5};inty[5]={6,7,8,9,0};x=y;//Failstocompile但是当我将一个数组放入一个类中时,复制构造函数和赋值运算符会起作用(我会说正如预期的那样,但它不是我所期望的)。#includestructX{virtual~X(){}//JustincaseitwassomethingtodowithPOD//makesureitsnotaPODintx[5];};intmain(){Xa;a.x[0]=0;a.x[1]=1;a.x[2]=2;a.x[3]=3;a.x[4]=4;//Makeac

c++ - 为什么 *must* delete[] 和 delete 是不同的?

我很清楚,在C++中,delete[]是new[],delete是new。这与C++语法无关。我想知道reasonsdelete[]被定义为与普通delete不同的东西。这样做的实现原因是什么?考虑一下这段代码会发生什么:MyClass*object=newMyClass;deleteobject;当遇到delete时,内存管理器必须在其分配结构中查找对象指针值,无论它是什么,并标记相应的sizeof(MyClass)block内存为空闲。现在考虑一下这段代码会发生什么:MyClass*array=newMyClass[num_objects];delete[]array;当遇到del

c++ - 在 DLL 中分配内存并将指向它的指针指向客户端应用程序是不好的做法吗?

我正在使用动态加载DLL的exe。DLL中的函数在堆上分配内存并将指向该内存的指针传递给exe。一位学长说这样做是不好的做法。他说,如果我必须在exe和DLL之间共享内存,则exe必须分配内存并将指向该内存的指针传递给DLL,反之亦然。这是真的?为什么?编辑:就我而言,我计划在DLL本身内部分配和释放内存。 最佳答案 以下是让调用者提供指针的一些原因:对称所有权语义。其他几个答案已经解释了这一点。避免分配器和释放器不匹配。如Aesthete'sanswer中所述,如果DLL分配一个指针并返回它,调用者必须调用相应的释放器来释放它。这

c++ - 编写一个只有头文件的库是不可能的吗?

是否存在这样一种依赖模式,以至于不可能将所有内容都保存在头文件中?如果我们只强制每个header一个类的规则怎么办?出于这个问题的目的,让我们忽略静态的东西:) 最佳答案 我知道标准C++中没有任何特性,除了您已经提到的静态特性,它需要一个库来定义一个完整的翻译单元(而不仅仅是标题)。但是,不建议这样做,因为这样做会强制所有客户端在库更改时重新编译他们的整个代码库。如果您使用源文件或静态库或动态库形式的分发,则可以更改/更新/修改您的库,而无需强制所有人重新编译。 关于c++-编写一个只

c++ - 在 C++ 源代码中使用重音字符是不是很糟糕?

我希望我的程序尽可能便携。我在字符串中搜索重音字符,例如è.这可能是个问题吗?是否有等效于HTML实体的C++?它将在switch语句中使用,例如:switch(someChar)//someCharisoftypechar{case'é':x=1;break;case'è':...} 最佳答案 在C++源代码中使用非ASCII字符的主要问题是编译器必须知道用于源代码的编码。如果源是7位ASCII,那么它通常无关紧要,因为大多数编译器默认情况下都假定ASCII兼容编码。此外,并非所有编译器都可以在编码方面进行配置,因此两个编译器可能

c++ - 为什么一行中的多个作业被认为是不好的风格?

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter寻求指导。关闭9年前。在C++中,您可以通过这样做进行多重赋值x=y=z=10;然而,很多人告诉我这是一种糟糕的风格,我不应该在没有给出理由的情况下使用它。有人可以向我解释一下为什么这被认为是不好的风格吗? 最佳答案 试试这些定义:intx;booly;intz;x=y=z=10;并对x的值感到惊讶。

c++ - 在 C++ 中,通过引用传递 const bool 是不是很糟糕?

在实际环境中,使用gcc或MSVisualStudio,通过const引用传递大小相同或小于int的值类型是否不好?即写这样的函数是不是很糟糕:voidf(constbool&b);或voidf(constchar&c);而不是:voidf(boolb);或voidf(charc);我问的原因是我看不到在这些情况下传递引用的好处,但也许我遗漏了一些东西。 最佳答案 它可能有点糟糕,或者根本没有效果(取决于原始值的存储位置、优化器的好坏以及它决定如何处理您的代码)。该标准没有规定如何实现引用,但实际上编译器使用指针来实现引用。因此,在