这种情况下,函数的返回值只能是指针或其变体形式。如果返回类型是 shape,实际却返回一个 circle,编译器不会报错,但结果多半是错的。这种现象叫对象切片(object slicing),是 C++ 特有的一种编码错误。这种错误不是语法错误,而是一个对象复制相关的语义错误,也算是 C++ 的一个陷阱了,大家需要小心这个问题。
来自:01 | 堆、栈、RAII:C++里该如何管理资源?
19 人划过
在 C++11 之前,返回一个本地对象意味着这个对象会被拷贝,除非编译器发现可以做返回值优化(named return value optimization,或 NRVO),能把对象直接构造到调用者的栈上。
来自:03 | 右值和移动究竟解决了什么问题?
15 人划过
如果我提供了移动构造函数而没有手动提供拷贝构造函数,那后者自动被禁用
来自:02 | 自己动手,实现C++的智能指针
11 人划过
C++ 的构造函数是不能返回错误码的,所以你根本不能用构造函数来做可能出错的事情。你不得不定义一个只能清零的构造函数,再使用一个 init 函数来做真正的构造操作。
来自:06 | 异常:用还是不用,这是个问题
6 人划过
decltype(表达式) (表达式不是变量名,但包括 decltype((变量名)) 的情况)可以获得表达式的引用类型;除非表达式的结果是个纯右值(prvalue),此时结果仍然是值类型。
来自:08 | 易用性改进 I:自动类型推断和初始化
5 人划过
鸭子类型使得开发者可以不使用继承体系来灵活地实现一些“约定”,尤其是使得混合不同来源、使用不同对象继承体系的代码成为可能。唯一的要求只是,这些不同的对象有“共通”的成员函数。这些成员函数应当有相同的名字和相同结构的参数(并不要求参数类型相同)。
来自:12 | 编译期多态:泛型编程和模板入门
5 人划过
在这个 constexpr 函数里,是不能写 static_assert(n >= 0) 的。一个 constexpr 函数仍然可以作为普通函数使用——显然,传入一个普通 int 是不能使用静态断言的
来自:15 | constexpr:一个常态的世界
4 人划过
后缀 来将用户提供的字面量转换成实际的类型
来自:09 | 易用性改进 II:字面量、静态断言和成员函数说明符
4 人划过
要进行编译期编程,最主要的一点,是需要把计算转变成类型推导。
来自:13 | 编译期能做些什么?一个完整的计算世界
4 人划过
这个代码的目的是消除大部分执行路径上的加锁开销。原本的意图是:如果 inst_ptr_ 没有被初始化,执行才会进入加锁的路径,防止单件被构造多次;如果 inst_ptr_ 已经被初始化,那它就会被直接返回,不会产生额外的开销。虽然看上去很美,但它一样有着上面提到的问题
来自:20 | 内存模型和atomic:理解并发的复杂性
3 人划过
*精彩内容为该课程各文章中划线次数最多的内容
编辑推荐
讲师的其他课程
包含这门课的学习路径
Android工程师
8门课程 35.1w人学习
C++工程师
7门课程 51.5w人学习
看过的人还看了