记一些自己遇到的坑

类内包含非静态的右值引用成员时隐式生成的复制构造函数是delete的,但是移动构造正常,因此包含右值引用的tuple只能移动,msvc的bind实现应该是错误的

当一个类继承的类模板处于其他命名空间的时候注入的名称不会带有命名空间限定和模板参数,因此如果继承了多个具有不同参数的类模板并需要调用特定类模板的成员函数的话需要带上嵌套类型说明符和模板参数

当类T的复制(或移动等,效果相似)构造函数声明为delete时,std::is_convertible_v<T, T>将会是false,在尝试用类型U构造T进行推断时仅用std::is_convertible_v<U, T>不能推断出尝试调用的不是复制构造函数,而因此将可能会因为匹配到复制构造函数而编译失败

类内包含智能指针时(或自动生成的代码会要求指定的类型必须完整之时),若其指向的类型使用前向声明等引入(因而不完整),且包含它的类没有用户定义的析构函数(或类似的可能由编译器自动实现的函数)之时,仅包含该类的头文件将会导致要求类型完整的错误,此时手动定义一个析构函数可以解决这个问题,此析构函数可以什么都不做(= default 也可以),但需要在实现文件中定义,在头文件定义不能解决这个问题,若必须在头文件定义(例如该类是类模板)则无法完美地解决这个问题

类模板显式实例化的时候会同时在当前翻译单元显式实例化constexpr函数,因此其他翻译单元会找不到这个constexpr函数,因此会链接失败

使用智能指针实现链表时要注意析构的时候必须手动一个个释放节点,否则可能因为节点太多而在析构时爆栈

常见于构造函数的问题,若一个构造函数模板接受T&&作为参数(或者T&&…这样的),则可能会优先于复制和移动构造函数被匹配,如下例:

Linux默认搜索动态库是不会搜索当前目录的,通过使用LD_LIBRARY_PATH可以强制搜索当前目录,但是总觉得这个方法很脏。。。希望有更干净的方法

Unity从Assets里加载二进制数据可以使用TextAsset来加载,需要将后缀名改为.txt,加载后使用bytes属性获得数据

调试部署到Android的Unity工程需要在Build Settings里启用Development Build和Script Debugging,然后在VS直接附加到Unity调试器就可以了

Unity调试插件的时候加载不了符号,因为需要mdb文件,可以使用mono的pdb2mdb来生成mdb文件,这里有2个坑,第一个是unity官方说明是传递pdb文件为参数,事实上传递pdb文件做参数是错误的,会报告不是合法的pe文件,应该传递的是dll文件,第二个是unity附带的pdb2mdb处理纯pdb的调试信息会报错:Microsoft.Cci.Pdb.PdbDebugException: Unknown custom metadata item kind: 6,而其他形式的调试信息则干脆OutOfMemoryException了,使用https://gist.github.com/jbevain/ba23149da8369e4a966f 这里提供的pdb2mdb文件才能正确对纯pdb的调试信息生成mdb文件(而其他的调试信息仍然OutOfMemoryException,无解)

安装对应1809的WDK之后,Visual Studio 2017开始出现默认开启Spectre缓解的问题,如果未安装对应的运行库则会出现诡异的问题如无法调试及谜之编译失败(缺少各种运行库)等,后来查到了这篇帖子才知道被坑了,通过grep查找发现WDK安装目录\build\WindowsDriver.OSTargets.props中的

段落导致了默认开启Spectre缓解,修改为false以后发现问题依旧,继续查找发现Visual Studio安装目录\2017\Community\Common7\IDE\VC\VCTargets\Platforms(平台名)\ImportBefore\Default\Microsoft.Cpp.WDK.props也包含了相同的段落,同样修改之,问题解决

“记一些自己遇到的坑”的一个回复

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注