Pass Actor To Next Level Through Seamless Travel

因为UnrealEngine在切换关卡(OpenLevel)时会把当前关卡的所有对象全部销毁,但是常常我们需要保存某些对象到下一关卡中,今天读了一下相关的代码,本篇文章讲一下如何来实现。
其实Unreal的文档是有说明的(Travelling in Multiplayer),实现起来也并不麻烦,但是UE文档的一贯风格是资料是不详细的,中文资料更是十分匮乏(多是机翻,而且版本很老),在搜索中也没有查到相关的靠谱的东西,我自己在读代码实现的过程中就随手记了一下,就当做笔记了。

阅读全文 »

Why can't we override && and || and , (comma)?

C++的基础语法里提供了||&&两个逻辑操作符还有,(comma)运算符。在类中我们也可以重载这些操作符,但是不要这样做,我会在这篇文章中写出标准描述以及不能重载的原因。
概括来说,因为内置的||和&&具有短路求值语义,如果你自己重载了他们就变成了普通的函数调用,会具有与built-in ||&&完全不同的语义。
而,操作符具有从左到右求值的语义,所以如果自己重载,会变成函数调用,也会具有不同于built-in的语义。

阅读全文 »

How lambda is implemented in the compiler

在C++中lambda-expression的结果叫做闭包对象(closure object)。本篇文章并非是介绍C++ lambda的用法的(这一点《TC++PL》、《C++ Primer》中都十分详细,或者看我之前的总结C++11的语法糖#lambda表达式),而是从LLVM-IR来分析在Clang中是如何实现lambda-expression的。

阅读全文 »

Visibility and accessibility of access control mechanisms

在上一篇文章突破C++类的访问控制机制中简略提到了C++类的成员访问控制(public/protected/private)只是限制了成员名字的可访问性(accessable)**而非可见性(visable)**。在这篇文章中主要分析这种性质带来的后果以及如何避免。

阅读全文 »

Breaking through the access control mechanism of C++ classes

众所周知,在C++中类成员能够具有三种访问权限,分别为public/protected/private
[ISO/IEC 14882:2014]A member of a class can be

  • private: that is, its name can be used only by members and friends of the class in which it is declared.
  • protected: that is, its name can be used only by members and friends of the class in which it is declared, by classes derived from that class, and by their friends (see 11.4).
  • public: that is, its name can be used anywhere without access restriction.

从标准意图上来看,是希望隐藏类的实现细节和底层数据,即为封装。但是我们也可以通过一些特殊的方式来突破访问权限的限制。

阅读全文 »

C++ Technical Book Reviews Summary

单独开一篇文章,之前零零散散的书评散落在笔记微言中,没有具体辑录到一块,不方便索引。以后读过的技术类的书籍之后我会写一些评价就都放到这里来了。因为评价对象是技术书籍,只言片语也不能描述所有的技术细节,本文立意也非“技术笔记”而是“书籍评价”,所以我不会在这里涉及太多书籍中描述的技术细节,只是我作为一个普通读者的阅读感受以及分享我个人的阅读技巧,若其中对某些书透露出褒贬之意均为我个人对书籍的评价无任何贬低作者的意图。

阅读全文 »

Implicit declaration of special member-func and their standard behavior

在C++编程中比较痛恨欲绝的事莫过于:编译器瞒着程序员做了太多事。
本篇文章是从C++标准([ISO/IEC 14882:2014])中整理摘录出来的关于编译器生成类的默认构造函数(default constructor)/拷贝/移动构造函数(copy/move constructor)/拷贝/移动赋值操作符(copy/move assignment operator)/析构函数(destructor)这六个特殊成员函数的几种情况以及其实际行为的文档。可以作为《Inside The C++ Object Model》的辅助资料,组合观看效果更佳(通过标准描述来理解编译器的实现)。
另外,《Inside The C++ Object Model》主要是从“编译器实现”的角度来描述的,但是从“C++标准”的角度来看,书里很多是依赖于编译器实现的,就像虚函数表,标准并没有规定编译器应该用何种方式实现多态行为,自然也就不可能描述关于虚函数表的东西。
还有很多对于“编译器生成”的行为在主观意识中带有歧义的理解,都可以在这里找到解答,这也是读C++标准的乐趣所在——不论好坏,标准规定不会出错,所有不符合标准描述的实现都是unstandard的。

阅读全文 »