首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么通过显式不可移动和隐式不可复制类型的值返回向量不会产生编译错误?

通过显式不可移动和隐式不可复制类型的值返回向量不会产生编译错误的原因是,向量的返回操作实际上会调用移动构造函数或移动赋值运算符,而不是复制构造函数或复制赋值运算符。

在C++中,显式不可移动类型是指具有显式定义的移动构造函数或移动赋值运算符的类型。这些操作符告诉编译器如何将对象的资源从一个对象转移到另一个对象,而不是进行复制操作。隐式不可复制类型是指具有删除的复制构造函数或复制赋值运算符的类型,这意味着编译器禁止对该类型进行复制操作。

当返回一个向量时,如果向量的元素类型是显式不可移动和隐式不可复制类型,编译器会尝试调用移动构造函数或移动赋值运算符来将向量从函数的局部变量移动到返回值。由于这些类型不可复制,编译器不会尝试调用复制构造函数或复制赋值运算符,因此不会产生编译错误。

然而,需要注意的是,如果向量的元素类型是显式可移动或隐式可复制类型,编译器将尝试调用复制构造函数或复制赋值运算符来复制向量,而不是移动它。如果这些操作被删除或不可用,则会导致编译错误。

总结起来,通过显式不可移动和隐式不可复制类型的值返回向量不会产生编译错误,是因为编译器会调用移动构造函数或移动赋值运算符来移动向量,而不是复制它。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C ++ 中不容忽视 25 个 API 错误设计!

因此,在我们例子中,如果要使类不可复制不可移动,我们将标记移动构造函数movbe赋值操作符为已删除。...因此,如果你类只包含简单数据类型,并且你计划使用生成移动构造函数,那么如果你定义复制构造函数则不可能。在这种情况下时,你必须定义移动构造函数。...错误#6:不将单个参数构造函数标记为 为什么这是一个API设计错误? 允许编译器进行一次转换以将参数解析为函数。...,因为现在编译不会将第一个参数类型强制为向量对象。...错误#8:通过const引用返回API内部 为什么这是一个错误? 从表面上看,通过const引用返回一个对象似乎是双赢。这是因为: 避免不必要复制

1.5K20

每个C++开发者都应该学习使用C++11特性

NULL 0 都可以地转换为整数类型,可能引入一些不符合预期行为。 为了解决这些问题,C++11 引入了 nullptr,它是一个明确空指针常量,不具有整数类型,可以地表示空指针。...C++11中提供了三种主要智能指针: std::unique_ptr: 独占所有权智能指针。它不能被复制,但可以被移动。当指针超出作用域或被释放时,它所管理资源将被释放。...对于大型对象或对象包含动态分配资源,这种复制操作可能会导致昂贵性能开销,尤其是在函数参数传递返回返回时。 2....通过引用,可以识别出临时对象,并且在这些对象上应用移动语义。 移动语义允许将资源从一个对象转移到另一个对象,而不是复制资源。...std::vector vec; vec.push_back("example"); // 移动临时对象 在函数返回中使用: 当函数返回一个临时对象时,可以通过移动语义避免不必要复制

4710

SystemVerilog(七)-网络

工程师在使用网络类型时需要小心避免编码错误。网络列表中简单错误可能会导致同一网络无意中连接到多个驱动程序。在编译优化过程中不会捕获这种类型错误。该错误会导致在仿真过程中检测到功能性错误。...这些建模错误在SystemVerilog中是合法,因为网络类型允许多个驱动程序。 通过将输入端口声明为var logic类型,可以防止输入端口意外多个驱动程序。变量不允许多个驱动源。...网络可以用与变量相同方式声明为有符号或无符号。 网络位部分选择。可使用与变量向量相同语法从向量中选择任何特定位或位组。常量变量位部分选择都可以在网络上执行。...网络可以减少编写网表模型所需时间,并减少键入错误。 但是,网络一个缺点是,与模块、接口或例化实例连接中拼写错误名称不会被检测为连接错误。...这就要求声明所有网络,禁用网络是通过设置编译器指令来完成: 此编译器指令必须在模块外部设置,并对编译到同一编译单元所有后续模块保持有效,或者直到遇到另一个'default_nettype指令

1.3K40

第4章 | 移动

——译者注 4.2 移动 在 Rust 中,对大多数类型来说,像为变量赋值、将其传给函数或从函数返回这样操作都不会复制,而是会移动。...但与 C++ 一样,所有权始终是明确:程序不需要引用计数或垃圾回收就能知道何时释放向量元素字符串内容。 代价是如果需要同时访问它们,就必须地要求复制。...之前我们谨慎地说过,大多数类型会被移动,现在该谈谈例外情况了,即那些被 Rust 指定成 Copy 类型类型。对 Copy 类型进行赋值会复制这个,而不会移动它。...只有那些可以通过简单地复制位来复制类型才能作为 Copy 类型。前面解释过,String 不是 Copy 类型,因为它拥有从堆中分配缓冲区。...这确实意味着 C++ 类可以提供 Rust 类型所无法提供便捷接口,比如可以在看似普通代码中调整引用计数、把昂贵复制操作留待以后进行,或使用另一些复杂实现技巧。

4210

你不知道JavaScript(中卷)一

应该使用a.charAt(1)取下标位置字符 3.字符串不可变是指字符串成员函数不会改变其原始,而是创建并返回一个新字符串。...四、强制类型转换 A.类型转换 1.将从一种类型转换为另一种类型通常称为类型转换(type casting),这是情况;情况称为强制类型转换(coercion) 2.JS中强制类型转换总是返回标量基本类型...,如字符串、数字布尔不会返回对象函数;“封装”,就是为标量基本类型封装一个相应类型对象,但这并非严格意义上强制类型转换 3.类型转换发生在静态类型语言编译阶段,而强制类型转换则发生在动态类型语言运行时...,允许从符号到字符串强制类型转换,然而强制类型转换会产生错误。...• 符号不能够被强制类型转换为数字(都会产生错误),但可以被强制类型转换为布尔都是true) E.宽松相等严格相等 1.

1.2K20

【笔记】《C++Primer》—— 第10章:泛型算法

关于捕获变量,lambda有捕获,引用捕获,捕获三种类型。...其中值捕获引用捕获区别就是写入捕获列表名称是否加上引用符而已,效果也与引用变量相同 捕获比较特别,通过在捕获列表中无名地写个=或&,可以告诉编译器推断函数所需要捕获,其中=是捕获推断,&是引用捕获推断...两种捕获不能简单混用,如果声明了一种捕获,那么剩余只能用传统捕获,且捕获类型还要和捕获不同,而且捕获必须排列在捕获前面 int main() {...auto lam2 = [&] {return a; }; // 混合捕获a(捕获),b(引用捕获) auto lam3 = [=, &b...{return a; }; 当lambda函数体中存在不止一句return时,编译器将假定返回类型为void,此时要通过第六章讲到尾置返回来指定所需返回类型 // 尾置返回指定 auto lam1

62420

挑逗 Java 程序员那些 Scala 绝技

Java 优势在于它类型可读性,如果声明了 userId 类型,虽然还是可以正常通过编译,但是在代码审查时,这个错误将会更容易被发现。...我们可以通过方式传入一个线程池,具体执行过程由线程池完成。...九、参数转换 挑逗指数: 五星 参数 如果每当要执行异步任务时,都需要传入线程池参数,你会不会觉得很烦?Scala 通过参数为你解除这个烦恼。...如果 Scala 在编译时发现了错误,在报错之前,会先对错误代码应用转换规则,如果在应用规则之后可以使得其通过编译,则表示成功地完成了一次转换。...在不同库间实现无缝对接 当传入参数类型目标类型不匹配时,编译器会尝试转换。利用这个功能,我们将已有的数据类型无缝对接到三方库上。

98620

由 Go 结构体指针引发传递思考

S } 要回答这个问题,涉及到 Go 中几个概念,引用转换可寻址 Addressable 引用转换 先看第一次调用 Write 地方,首先 sVals[1] 返回是一个 S 类型赋值给变量...s := sVals[1] s.Write() 那么为什么第二个 Write 调用无法编译通过呢?...map 传递 在 Go 中,所有的函数参数返回都是通过传递,这意味着它们都是原始数据副本,而不是引用或指针。...所以上述代码中 sVals[1] 返回是一个副本,也就是说这是一个临时值,而对于临时值是不可寻址。所以引用转换是不可,最后无法编译通过报出错误。...为什么要这样设计 为什么 map 要返回一个副本回来,而不是返回原始对象地址?这种设计选择是出于安全性一致性考虑。

15710

Chapter 2: auto

1.更多使用auto而不是类型声明 将大段声明缩减成auto 例如: typename std::iterator_traits::value_type currValue = *b;...2.当auto推导出错误类型时使用类型初始化方式 当表达式返回类型是代理类类型时,不能使用auto 例1: //提取出Widget对象特征,并以vector形式返回 //每一个...因为std::vector虽然持有bool,但是operator[]作用于vector时,并不会返回vector容器中元素引用([]操作返回容器内元素引用对于其他类型都适用,...为什么会存在这种类型对象呢?因为vector是通过紧凑形式来表示bool,每一个bit代表一个bool。...,同时增强程序可移植性减少重构复杂性;但也由于与代理类冲突,造成了一些潜在问题,但是这些问题不是auto引起,而是代理类本身问题,因此静态类型转换可以保留auto优点,同时保证程序正确性

1.1K70

【C++】你想要——印刷模板儿

较小类型转化成较大类型。 当然不会类型转化只有在 赋值:b=3;(产生临时变量);函数传参时候(产生临时变量),才会发生类型转化。...当b传时,中间临时变量具有常性(只读),而形参是可读可写,权限就会放大,也是不可通过,除非加了const,但是加了const就无法交换了,所以这样还是行不通!...但是模板参数不同,他们就是不同类型 return 0; } 可能有人会问:s1=s2;  会不会发生类型转换呢?...当然不会类型转换只有在类型相近才会发生。...但在链接时候,test.cpp中,却不能找到它地址,这是为什么??这就是模板其他区别! 链接错误原因: .cpp中定义,不是实例化模板,他只是一个模板,没有任何实例化成任何类型

38030

第5章 | 对引用,使用引用,引用安全

Matthew $ 但是,如果你已经阅读过第 4 章关于“移动部分,就会对 show 这个函数定义产生一些疑问。...表达式 &e 会产生对 e 共享引用,如果 e 类型为 T,那么 &e 类型就是 &T,读作“ref T”。共享引用是 Copy 类型。 可变引用允许你读取修改。...最重要是,它们都只是机器级别的地址。但在实践中,Rust 引用会给人截然不同感觉。 在 C++ 中,引用是通过类型转换创建,并且是解引用: // C++代码!...// 把20存入x,r本身仍然指向x 在 Rust 中,引用是通过 & 运算符创建,同时要用 * 运算符解引用: // 从这里开始回到Rust代码 let x = 10; let r = &...(*s, 0); // 错误:指向了已被丢弃数组元素 从 smallest 签名可以看出它参数返回必须具有相同生命周期 'a。

3610

c++11新特性,所有知识点都在这了!

auto:让编译器在编译器就推导出变量类型,可以通过=右边类型推导出变量类型。...左引用:对左进行引用类型。 右引用:对右进行引用类型移动语义:转移资源所有权,类似于转让或者资源窃取意思,对于那块资源,转为自己所拥有,别人不再拥有也不会再使用。...返回优化:当函数需要返回一个对象实例时候,就会创建一个临时对象并通过复制构造函数将目标对象复制到临时对象,这里有复制构造函数析构函数会被多余调用到,有代价,而通过返回优化,C++标准允许省略调用这些复制构造函数...关键字可以避免开发者在重写基类函数时无意产生错误。...explicit explicit专用于修饰构造函数,表示只能构造,不可以被转换,根据代码看explicit作用: 不用explicit: struct A { A(int value)

17.1K22

第 13 章 拷贝控制

所以,销毁一个分配动态内存内置指针类型成员,并不会 delete它所指向对象,需要调用 delete来回收资源。...新标准中,可以用容器保存不可拷贝类型,只要它们能被移动即可。 返回引用函数,连同赋值、下标、解引用前置递增/递减运算符,都返回。...可以通过标准库中 move函数来地将一个左转换为对应引用类型。在对一个对象使用 move函数后,可以对这个移后源对象进行销毁或赋值操作,但不能再使用它!...与拷贝操作不同,移动操作永远不会地定义为删除函数。如果既没有地要求生成=default移动操作,又不满足编译器合成移动操作条件,编译器根本就不会合成它们。...而如果用=default要求编译器生成移动操作,且编译器不能移动所有成员,则编译器会将移动操作定义为删除函数。

95450

【C++】类型转换

C语言中一共有两种形式类型转换: 类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败。 类型转化:需要用户自己手动进行类型转换。...类型转换适用于相似类型之间转换,比如 char、int、double 这类整形家族之间互转;而强制类型转换适用于不相关类型转换,比如 int int*。...这其实是因为变量 a 在定义时被 const 修饰,而编译器认为 a 不会被修改,所以编译器会将 a 放入一个寄存器中,以后每次使用 a 都直接从该寄存器中读取,而不再从内存中读取;这就导致了我们虽然通过指针变量...,也不会产生临时对象,我们称这个过程为切片/向上转型。...,如果非强制类型转换不可,则应限制强制转换作用域,以减少发生错误机会。

18620

【C++】C++中类型转化

说起类型转化,我们在C语言之前学习中可以了解到,类型转换可以分为两种情况:类型转化;显示类型转化。但是为什么在c++中还要继续对类型转化做文章呢?我们一起来看: 1....:类型 转换类型转换。...类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败 2....类型转化:需要用户自己处理 举个例子: int main() { double i = 4.2; //类型转化 int a = i; //显示强制类型转换 int...为什么还是2呢? 原因是:在编译时,因为是const修饰(不会修改),所以就会把a放入寄存器中,通过*p来改变是内存中a,但是a在寄存器中没有改变,依旧是2,所以打印时就是2。

1K10

Swift学习:可选型使用

= "404" print(errorCode) //"The errorCode is" +errorCode //直接使用可选型会编译通过,报错 解包方法1:普通if判断,不方便 if(errorCode...,存在错误风险。 //一般情况下,我们在确定使用可选型变量不会是nil,才通过!强制解包并使用 var errorCode: String?..."no error" ---- 第五部分:可选型 区别于可选型创建:类型+?,创建可选型使用:类型+!...可选型变量使用时,相当于其后面自带了一个感叹号,可以直接赋值给一个非可选型变量,但是可选型依然保持可选型特性,可以被赋值为nil,这就体现出来可选类型优点,即可用被赋值为nil,也可以不用每次解包...如果为nil,就不会执行任何操作,因此也不会产生运行错误。 非可选型变量或者常量不可能赋值为nil,所以不能使用:notOptioalValue != nil,判断是否nil。

1K50

什么?CC++面试过不了?因为你还没看过这个!

int A::doA() { return 0; } // 需要内联 编译器对 inline 函数处理步骤 将 inline 函数体复制到 inline 函数调用点处; 为所用 inline...继承:结构体嵌套 多态:父类与子类方法函数指针不同 explicit()关键字 explicit 修饰构造函数时,可以防止转换复制初始化 explicit 修饰转换函数时,可以防止转换...直接初始化 B b2 = 1; // 错误:被 explicit 修饰构造函数对象不可复制初始化 B b3{ 1 }; // OK:直接列表初始化 B b4 = { 1 }; // 错误...:被 explicit 修饰构造函数对象不可复制列表初始化 B b5 = (B)1; // OK:允许 static_cast 转换 doB(1); // 错误:被 explicit...错误:被 explicit 修饰转换函数 B::operator bool() 对象不可转换 bool b8 = static_cast(b1); // OK:static_cast

3.6K50

Google C++ 编程风格指南(三):类

可拷贝类型移动类型 如果你类型需要, 就让它们支持拷贝 / 移动. 否则, 就把产生拷贝移动函数禁用....可移动类型允许对象在初始化时得到来自相同类型临时对象, 或在赋值时被赋予相同类型临时对象 (因此所有可拷贝对象也是可移动). std::unique_ptr 就是一个可移动不可复制对象例子...对于用户定义类型, 移动操作一般是通过移动构造函数移动赋值操作符实现. 拷贝 / 移动构造函数在某些情况下会被编译调用. 例如, 通过方式传递对象....优点: 可移动及可拷贝类型对象可以通过方式进行传递或者返回, 这使得 API 更简单, 更安全也更通用....拷贝 / 移动构造函数与赋值操作一般来说要比它们各种替代方案, 比如 Clone(), CopyFrom() or Swap(), 更容易定义, 因为它们能通过编译产生, 无论是还是通过 =

76740
领券