败犬日报 2025-01-19
1. 为什么要区分 xvalue 和 prvalue
cpp
template <class T> struct is_prvalue : std::true_type {};
template <class T> struct is_prvalue<T&> : std::false_type {};
template <class T> struct is_prvalue<T&&> : std::false_type {};
template <class T> struct is_lvalue : std::false_type {};
template <class T> struct is_lvalue<T&> : std::true_type {};
template <class T> struct is_lvalue<T&&> : std::false_type {};
template <class T> struct is_xvalue : std::false_type {};
template <class T> struct is_xvalue<T&> : std::false_type {};
template <class T> struct is_xvalue<T&&> : std::true_type {};
一个比较直观但不一定完全精确的解释,就是 xvalue 是有 identity(可取址)的一个将亡对象,所以往往是被 move 的对象;prvalue 是将要创建的对象(C++17 之后在最终用到的时候才会创建,不然中间会经历一个 xvalue 状态);在 C++11 引入右值引用之后就需要引入这两个概念了,不然我们没法区分上面的 T
和 T&&
;其余的 properties 大抵都是基于这个区别衍生的,比如可否多态。
在 C++17 提出的这套设想里面,prvalue 更类似于一个“值”的概念,是不可操作的,不是对象。所以必须通过临时量实质化转变为对象才能操作,这个对象因为不被持有,所以是个 going to die 的。
"prvalues perform initialization, glvalues produce locations."
2. 假如我号称精通C++,你作为考官准备怎么难住我? - navegador的回答 - 知乎
https://www.zhihu.com/question/825891126/answer/82512275796
有点不实用。
3. 变量名命名
取名要有意义,方便阅读。就算是一个人的项目,不好好写,几天后自己就看不懂了。
比如用拼音,甚至拼音和英语混合,最难蚌的一集。这么写代码过不了任何一个正经公司的 code review。
英语是基本功,不会英语真的说不过去。
就算英语差,拼音命名也是最不可取的,不如直接中文命名。只要团队的人都懂中文。