草庐IT

c++ - 何时以及如何默认初始化一个 const 变量?

clang++不允许defaultinitializationofaconstvariableofclass-typewithoutauser-definedconstructor;g++的限制稍微少一些(见下文)。根据thisanswer,这是因为POD类型“默认情况下未初始化”。如果我理解正确的话,这意味着默认初始化不会调用默认构造函数,也不会调用值初始化,因此POD类型中的数据成员不会被初始化。当然,其中包含未初始化值的constPOD类型是没有意义的,因为它们永远不会被初始化,因此使用起来不安全。这种情况有几种变体:技术上该类型是“POD”,但不包含数据成员(仅包含函数)。(c

c++ - 如何知道函数何时必须是虚拟的?

在描述一个类时,如何知道什么时候函数必须是虚拟的?我知道虚函数是什么意思,但我就是想不通什么时候应该让它们成为虚函数谢谢 最佳答案 如果你想调用它们,函数应该是虚拟的polymorphically.换句话说,虚函数表示可以在子类中定制的行为。例如,考虑以下类:classCar{public:conststd::string&getId()const;virtualvoidstartEngine()=0;private:std::stringid;}每辆车都有一个Id,这里不允许自定义,因此没有必要将其虚拟化。子类不应该能够修改该属性

c++ - 何时实例化模板非静态数据成员初始化程序?

这是一个简短的独立测试用例来解释我的问题。GCC接受此代码,但clang和Intel拒绝它:templatestructfalse_t{staticconstboolvalue=false;};templateintf(){static_assert(false_t::value,"");return0;}templatestructS{intm=f();};ints=sizeof(S);或者,根据pmr的评论,这里有一个更简单的示例,它也被gcc接受并被clang拒绝:structS;templatestructX{intx=T();};ints=sizeof(X);sizeof(S

c++ - C++ 中何时引入了左值引用?

C++中何时引入了左值引用?Google搜索此问题会为我返回强调Rvalue引用的文章。我的问题是关于左值引用(单个&)。它们是在哪个版本的C++中引入的? 最佳答案 引用文献出现在1985年的第一版“C++编程语言”中,当时该语言尚未标准化。但自从1983年从“CwithClasses”重命名为“C++”后,它们就存在了。参见http://www.stroustrup.com/hopl2.pdf中的3.3. 关于c++-C++中何时引入了左值引用?,我们在StackOverflow上找

java - 何时用 256 初始化数组

我在浏览破解编码面试书籍解决方案时注意到以下问题:实现一种算法以确定字符串是否具有所有唯一字符。如果不能使用额外的数据结构怎么办?这是提供的解决方案之一:publicstaticbooleanisUniqueChars2(Stringstr){boolean[]char_set=newboolean[256];for(inti=0;i为什么char_set数组初始化为256?我在想这是因为有128个ascii字符,但我不确定。此外,这个解决方案似乎是用Java编写的,但如果用C++完成,是否还需要初始大小? 最佳答案 Iwasthi

c++ - 内联函数(何时插入)?

内联函数只是对编译器的请求,编译器将内联函数的完整主体插入代码中使用该函数的每个位置。但是编译器如何决定是否应该插入它呢?它使用哪种算法/机制来决定?谢谢,纳文 最佳答案 一些共同点:编译器选项(调试构建通常不内联,大多数编译器都有选项来覆盖内联声明以尝试内联全部或不内联)合适的调用约定(例如可变参数函数通常不是内联的)适合内联:取决于函数的大小、函数的调用频率、通过内联获得的yield以及优化设置(速度与代码大小)。通常,小函数最有好处,但如果只调用一次大函数,则可能会被内联内联调用深度和递归设置第三个可能是您问题的核心,但这实际

c++ - 使用 select() 检测套接字何时断开连接

我正在尝试检测客户端何时与select()函数断开连接。问题是,我不太了解select()是如何工作的。我正在使用以下代码,你能告诉我我做错了什么和/或如何检测客户端是否断开连接吗?我正在使用非阻塞套接字。intNetwork::bytesAvailable(){longbytes=0;if(ioctl(this->sockfd,FIONREAD,&bytes)sockfd,&fd);result=select(this->sockfd+1,&fd,0,0,&tv);if(result&&!this->bytesAvailable()){return-1;//disconnected,

c++ - 术语 "Most vexing parse"是何时何地创造的?

有无数文章和博客讨论C++的mostvexingparse,但我似乎找不到比“C++文献”更具引用意义的任何内容。这个词是从哪里来的? 最佳答案 ScottMeyers的书EffectiveSTL:50SpecificWaystoImproveYourUseoftheStandardTemplateLibrary可能是2001年首次发布使用。 关于c++-术语"Mostvexingparse"是何时何地创造的?,我们在StackOverflow上找到一个类似的问题:

c++ - 何时使用并行计数 - 当内存有问题时使用 MIT HAKMEM 进行位计数?

比特计数可以通过多种方式完成,例如。带有设置位迭代器、未设置位迭代器、带有查找表或并行计数的预计算位。正如我通过搜索网络发现的那样,当未设置位较少时,未设置位迭代器速度很快,而设置位迭代器则相反。但是什么时候应该使用并行计数,尤其是MITHAKMEM(见下文)?它看起来相当快,尽管可能比查找表慢。就速度而言,它总是比设置/未设置位更好吗?除了速度和内存之外,还有其他关于选择哪一个的问题吗?intBitCount(unsignedintu){unsignedintuCount;uCount=u-((u>>1)&033333333333)-((u>>2)&011111111111);ret

c++ - 何时使用 =default 与 =delete

据我了解,这些语义仅用于复制构造函数、移动构造函数、复制赋值、移动赋值和析构函数。使用=delete用于禁止使用其中一项功能,即=default如果您想向编译器明确说明在何处使用这些函数的默认值,则使用它。在制作类(class)时使用这些关键字的最佳做法是什么?或者更确切地说,在开发类(class)时我如何记住这些?例如,如果我不知道我是否会使用这些功能之一,最好用delete禁止它。或允许并使用default? 最佳答案 好问题。同样重要的是:哪里使用=default和=delete.我对此有一些有争议的建议。它与我们所有人(包括