摘要: 从C++17开始,移除trigraph。 简单考古一下,就是从前的键盘不支持ascii码,不能输入C语言的编程需要的{,},\ , ~ 。。。需要用三个可输入的字符组合表示:例如, ??= 等价于 # 参考:https://en.wikipedia.org/wiki/Digraphs_and_tri 阅读全文
posted @ 2018-03-20 15:21 thomas76 阅读(377) 评论(0) 推荐(0)
摘要: 3000ms !!我去。 阅读全文
posted @ 2018-03-20 13:01 thomas76 阅读(452) 评论(0) 推荐(0)
摘要: 考虑互斥量的使用,最基本的代码是: 这在很多例子里都常见。等等,为什么第8行编译不过去?那是因为您没有在C++17下编译。std::lock_guard是禁止拷贝和移动的。C++17 granteed copy ellision允许第8行编译通过。 比较一下,第24行和第15行,哪个更简洁一些呢? 阅读全文
posted @ 2018-03-20 12:27 thomas76 阅读(5605) 评论(0) 推荐(1)
摘要: C++17开使,throw()等价于noexcept。等等,throw(A,B,C)哪里去了?C++11时就被扔了。为什么?都被当垃圾扔了,还研究它干啥! 那可好了,只要研究好noexcept这一个“异常说明“就好,给学习C++的新人大大的松绑了。不用一边学习一边做语言的考古学家了。 考虑如下代码: 阅读全文
posted @ 2018-03-19 22:28 thomas76 阅读(379) 评论(0) 推荐(0)
摘要: 考虑如下代码: 这就是C++17带来的void_t神器。写个静态断言无比容易。手写个Concept检查也不再是C++库开发者的专利了。 配合SNINAE和enable_if ,如下: 参考:http://en.cppreference.com/w/cpp/types/void_t 原理:using引 阅读全文
posted @ 2018-03-19 15:08 thomas76 阅读(731) 评论(0) 推荐(0)
摘要: C++17, prvalue被重新定义,我的思路都乱了。 左值(lvalue):具有id属性的值。能通过写代码的方式抓住的一个值。例如: f()这个函数表达式的value catagories是lvalue。每次你写f()都能抓住相同的那个地址的值(存放在g_var)。 纯右值(prvalue):没 阅读全文
posted @ 2018-03-18 18:22 thomas76 阅读(699) 评论(0) 推荐(1)
摘要: 考虑如下代码: 眼花缭乱的初始化语法。带初始化器的,基本就是:=1 (1) ={1} 或 {1} 这几种情况。变量名字和初始化器的分隔符是:= () {}这三种 我们发现,对于用户定义类型,具有{} 初始化器的,优先匹配S(std::initializer_list<int> il)。这给人提了个醒 阅读全文
posted @ 2018-03-18 10:38 thomas76 阅读(197) 评论(0) 推荐(0)
摘要: 考虑如下代码: 文字量0的类型,永远是int 编译期int常量0,在遇到转换成指针的场合,会被隐式转换成指针。其它常量不会,1,2,3...都没有这个待遇 0值得这个特殊待遇,遇到变量就会不好使了。例如:第11行,变量x,即使其值为0也没用。这个规则会延续到模板,例如: 这相当于,调用的是: 第一个 阅读全文
posted @ 2018-03-17 21:37 thomas76 阅读(584) 评论(0) 推荐(0)
摘要: 考虑如下代码: 这段话在C++17前是编译不过的。因为在用到拷贝构造函数时,却遇到程序员禁止了它们(=delete标注的函数)。C++17新标准,Guaranteed Copy Elision。prvalue的含义发生变化(是啊,还没听说什么纯右值,广义右值之类的“新”名词,prvalue就改变了定 阅读全文
posted @ 2018-03-15 20:34 thomas76 阅读(262) 评论(0) 推荐(0)
摘要: 为什么要自己封装个String类?原因很多。QT库有自己的QString类,MFC有自己的CString类。STL标准库有自己的std::string类。MySQL数据库的C API接口使用原生的char*指针。。。。。。 自己写的程序用那种String?没法选择。这时候可能需要写一个万能的Stri 阅读全文
posted @ 2018-03-15 11:57 thomas76 阅读(1108) 评论(1) 推荐(0)