when someone abandons you,it is him that gets loss because he lost someone who truly loves him but you just lost one who doesn’t love you.
c++11 中的 auto 是一个占位符,编译器在编译期间自动推导出变量的类型,并适当地改变结果类型使其更符合初始化规则,因此 auto 定义的变量必须有初始值
1 | int x; |
顶层 const VS 底层 const:
有以下规律:
带引用时,auto 的推导结果保留表达式的 const 属性不带引用时,auto 的推导结果忽略表达式的顶层 const 和引用的底层 const,保留指针的底层 const1 | int i = 0; |
for-range loop 是和 auto 一起出现在 c++11 中的,和 auto 搭配使用,非常提高生产力
先说结论:
会为 range 的每一种元素都创建一份拷贝,不会改变 range 里面的元素
但是有两个特殊的情况
用于含有 proxy class reference 的 class 时,结果可能会出乎意料
例:vector
1 | std::vector<bool> vec {false, false}; |
不能用于含有 std::unique_ptr 等只有 move 语意的容器,因为 auto 在进行拷贝,而这类容器没有
1 | std::vector<std::unique_ptr<int>> vec; |
当需要修改 range(不含有 proxy class reference 处理时)里面的元素时,使用auto&
而 auto& 的使用同样有一种特殊情况,即 range 中是含有 proxy class reference 的元素
例:用于 vector
1 | std::vector<bool> vec {false, false}; |
很好的综合了上述两种情况:
当只需要读取 range 里面的元素时,使用 const auto&,这种用法没有特殊情况,即使是 std::vector
for(const auto x : range):使用 auto 代表需要拷贝元素,但是加上 const 来代表不要修改拷贝出来的元素,那么更好的使用是const auto&,因为这样可以避免拷贝开销,并且不会改变元素
for(const auto&& x : range):const auto && 将会只绑定右值,而且也无法进行修改元素,所以,更好的使用是const auto&,应用更广
be slow to promise and quick to perform.