摘要: 三个月不学习,就会忘记很多东西。这里对数组做一下复习。 二维数组T[R][C],本质上是由一维数组T[C]拼接成的。二维数组的名字a,本质上是指针,此指针的类型是:pointer to T[C], 而绝非是pointer to T仔细考虑就会想到a+1这个指针算数,1这个值肯定不是1byte,也不是 阅读全文
posted @ 2018-07-28 22:13 thomas76 阅读(134) 评论(0) 推荐(0) 编辑
摘要: 在名字空间上下文,using 一个标识符,另一个标识符... ; 引入其它名字空间的名字到本空间。 引入之后,本名字空间就不允许定义cout,endl这样的有冲突的名字了: 在类定义的上下文,using 一个标识符,另一个标识符...; 是把属于基类的成员的名字引入。例如: D类中,允许使用的名字有 阅读全文
posted @ 2018-04-11 16:33 thomas76 阅读(259) 评论(0) 推荐(0) 编辑
摘要: 参考:http://www.learncpp.com/cpp-tutorial/132-function-template-instances/ 这种模板实例化的方法,我是第一次见。把模板取地址,强制转换为函数指针。 阅读全文
posted @ 2018-04-10 13:59 thomas76 阅读(124) 评论(0) 推荐(0) 编辑
摘要: simplify-cpp isocpp vitiy ibm ruminations learncpp 阅读全文
posted @ 2018-04-06 19:52 thomas76 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 类模板的使用,需要指定模板参数。自从C++17起,支持根据构造函数的实际参数,推导类模板的类型参数。 用户还能干预推导,通过指定一个User-defined deduction guides 第8行,指示编译器,当遇到char const*参数时,就把T推导成std::string参考:http:/ 阅读全文
posted @ 2018-04-06 19:29 thomas76 阅读(368) 评论(0) 推荐(0) 编辑
摘要: 第11行,返回值类型按照const auto& 模式推导。这是用户指定的方式,可以随意指定成auto前后可以添加volatile const & && * **等修饰符,只要能推导成功就行。 当然,也可以指定一个具体类型: 第11行,强制返回值类型为long,只要foo()到long隐式转换能ok。 阅读全文
posted @ 2018-04-06 09:36 thomas76 阅读(571) 评论(0) 推荐(0) 编辑
摘要: 考虑如下代码: 把元素2(key==2)在a,b两个容器之间移动。涉及到heap的内存分配和释放。当insert时,发生malloc,当erase时,发生free。C++17开始,支持无heap动作的元素搬移: 关键在于extract函数,它返回一个node handle。这个东西不是迭代器。参考: 阅读全文
posted @ 2018-04-05 18:32 thomas76 阅读(447) 评论(0) 推荐(0) 编辑
摘要: 第9行,虽然不合逻辑,但是也能编译通过。第15行,没有列表项,要枚举干嘛? 阅读全文
posted @ 2018-04-05 13:00 thomas76 阅读(195) 评论(0) 推荐(0) 编辑
摘要: 最简单的lambda: 让lambda更有用,就要捕捉局部变量。 [x]是按值方式的捕捉,而且lambda对应的那个可调用的方法,是const。可以脑补这个等价物: 可以使用mutable重新标记lambda函数,这个标记会清除const标记。例如: [&y]是按照引用方式捕捉局部变量。例如: 可见 阅读全文
posted @ 2018-04-05 12:08 thomas76 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 第22行,编译失败。double可以隐式转换为S,调用第8行的==重载函数。但是C++明确的拒绝了这一条道路。 阅读全文
posted @ 2018-04-04 13:38 thomas76 阅读(207) 评论(0) 推荐(0) 编辑