草庐IT

c++ - 为什么将类特殊函数显式声明为 "default"

这个问题在这里已经有了答案:Whatdoes"default"meanafteraclass'functiondeclaration?(5个答案)关闭5年前。显式声明类特殊函数默认值有什么区别。classMyclass{public:Myclass()=default;virtual~Myclass()=default;Myclass(MyClass&&)=default;Myclass&operator=(MyClass&&)=default;Myclass(constMyClass&)=default;Myclass&operator=(constMyClass&)=default

c++ - 如果显式定义了构造函数,是否必须初始化类成员?

我的大学课本上说:Whenaconstructorisdeclaredforaclass,initializationoftheclassobjectsbecomesmandatory.链接到specificpageofthebook.我们可以声明什么都不做的构造函数,因此初始化肯定不是强制性的,是吗?如果不是,作者的意思是在风格上如果我们显式声明构造函数,我们应该初始化类成员,也就是说,它是作为规则还是指南? 最佳答案 如果出现以下情况,我们必须在构造函数中初始化成员:成员没有默认构造函数。成员是reference/const-r

c++ - 什么时候显式调用 C++ 析构函数?

哪些情况下需要显式调用析构函数? 最佳答案 当你使用placement-new是一个常见的原因(唯一的原因?):structfoo{};void*memoryLocation=::operatornew(sizeof(foo));foo*f=new(memoryLocation)foo();//note:notsafe,doesn'thandleexceptions//...f->~foo();::operatordelete(memoryLocation);这主要出现在分配器(由容器使用)中,分别在construct和destro

c++ - 强制执行显式默认的特殊成员函数生成

在C++11中,可以显式默认一个特殊成员函数,如果它的隐式生成被自动阻止。但是,显式默认一个特殊成员函数只是撤销手动声明一些其他特殊成员函数(复制操作、析构函数等)导致的隐式删除,它不会强制编译器生成函数和代码即使函数实际上无法生成,也被认为是良构的。考虑以下场景:structA{A()=default;A(constA&)=default;A(A&&)=delete;//Moveconstructorisdeletedhere};structB{B()=default;B(constB&)=default;B(B&&)=default;//Moveconstructorisdefau

c++ - 即使有显式实例化,也没有为显式专用模板生成代码

我从gcc4.8.3和clang3.2得到了一致的行为,但不明白为什么会这样。尽管我有一个类模板的显式实例化,但当我使用模板的完全专用实例时,代码没有生成并且我得到一个undefinedsymbol。我在文件“temp.hpp”中有一个简单的类模板定义#pragmaoncetemplateclassC{public:C(T1c):d_c(c){};~C()=default;voidprint();private:T1d_c;};请注意,方法“print()”已声明,但未在此处定义。我想要.cpp文件中的定义,它将专门用于不同的类型。所以在temp.cpp文件中我有print()方法的默

c++ - 是否可以在 C++17 的 GCC 中使用显式寄存器变量?

我正在使用explicitregistervariables使用没有machine-specificconstraints的寄存器将参数传递给原始Linux系统调用(例如x86_64上的r8、r9、r10)按照建议here.#include#ifdef__i386__#define_syscallOper"int$0x80"#define_syscallNumReg"eax"#define_syscallRetReg"eax"#define_syscallReg1"ebx"#define_syscallReg2"ecx"#define_syscallReg3"edx"#define_s

c++ - 为什么必须显式加入线程?

所以这看起来很简单:#include#includevoidsecond(){cout如果我不包含join(),那么系统会调用abort()。我不明白这个,线程不应该自己退出吗?必须加入线程似乎会使代码更难正确封装。这是怎么回事? 最佳答案 那是C++线程库设计的一部分。您不需要加入线程,您也可以分离它。但我不建议您默认使用detach线程,因为这会带来一系列复杂问题。与您所说的相反,我认为这根本不会使代码更难封装。有不同的抽象级别,选择线程级别意味着您需要意识到存在线程并且需要处理它们。对于不同的事物你可以选择不同层次的抽象,例如

C++:你能做一个 lambda 隐式复制捕获加上显式复制捕获吗?

试图让一个对象保持事件状态(但不需要引用shared_ptr来这样做)我发现自己写了这样的东西:voidClassDerivedFromSharedFromThis::countdown(ThreadPool&pool,std::stringname){autoself=shared_from_this();pool.then([=,self]{for(inti=0;i但随后在visualstudio中出现错误,提示我无法显式复制捕获,因为我已经在隐式复制捕获...这迫使我写:voidcountdown(ThreadPool&pool,std::stringname){autoself

c++ - 容器中需要显式移动构造函数吗?

我有一个模板化的容器类:templateclassBag{private:std::vectormData;};我想做voidInPlace(Bag&Left){Bagtemp;Transform(Left,temp);//fillstempwithdesirableoutputLeft=std::move(temp);}假设Array具有用户定义的移动语义,但Bag没有。在这种情况下,mData会被移动或复制吗? 最佳答案 它将被移动,而不是被复制。我建议看下图:这清楚地表明,只要用户不定义自己的移动构造函数,编译器就会隐式生成移

c++ - 为什么显式模板实例化的位置很重要

假设我声明了一个模板类A在a.h#includetemplateclassA{public:voidprint(std::ostream&out);};并在a.cpp中定义打印方法(明确说明true和false)#include"a.h"templatevoidA::print(std::ostream&out){out;templateclassA;main.cpp中的主程序示例可能是#include"a.h"intmain(){Aa;a.print(std::cout);}上面的小项目编译得很好。问题:如果我将显式实例化放在print的定义之上方法(在a.cpp中),代码不再编译,