From 4a5f03b2291c67e3c04c5506ce4d3d19bc6e5ef7 Mon Sep 17 00:00:00 2001 From: racaljk <1948638989@qq.com> Date: Thu, 12 Oct 2017 20:51:50 +0800 Subject: [PATCH] =?UTF-8?q?item10=EF=BC=9Aupdate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 3.MovingToModernCpp/item10.md | 22 ++++++++++++++++++++++ README.md | 15 ++++----------- 2 files changed, 26 insertions(+), 11 deletions(-) create mode 100644 3.MovingToModernCpp/item10.md diff --git a/3.MovingToModernCpp/item10.md b/3.MovingToModernCpp/item10.md new file mode 100644 index 0000000..eb1e0e7 --- /dev/null +++ b/3.MovingToModernCpp/item10.md @@ -0,0 +1,22 @@ +## Item 10:优先考虑限域枚举而非未限域枚举 +条款10:优先考虑限域枚举而非未限域枚举 + +通常来说,在花括号中声明一个名字会限制它的作用域在花括号之内。但这对于C++98风格的enum中声明的枚举名是不成立的。这些在enum作用域中声明的枚举名所在的作用域也包括enum本身,也就是说这些枚举名和enum所在的作用域中声明的相同名字没有什么不同 +```cpp +enum Color { black, white, red }; // black, white, red 和 + // Color一样都在相同作用域 +auto white = false; // 错误! white早已在这个作用 + // 域中存在 +``` +事实上这些枚举名泄漏进和它们所被定义的enum域一样的作用域有一个官方的术语:未限域(unscoped)枚举。在C++11中它们有一个相似物,限域枚举,它不会导致枚举名泄漏: +```cpp +enum class Color { black, white, red }; // black, white, red + // 限制在Color域内 +auto white = false; // 没问题,同样域内没有这个名字 + +Color c = white; //错误,这个域中没有white + +Color c = Color::white; // 没问题 +auto c = Color::white; // 也没问题(也符合条款5的建议) +``` +因为限域枚举是通过**enum class**声明,所以它们有时候也被称为枚举类(enum classes)。 diff --git a/README.md b/README.md index 2d4ba8d..6740fe9 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ # 《Effective Modern C++ 》翻译 ![bookLogo](http://p1.bpimg.com/567571/bc7c228ba08fae01.png) -> !本书要求读者有较高水平的C++知识
+> ! 2017.10开始更新
+> ! 我没有版权,我没有版权,我没有版权,侵权请告知1948638989@qq.com
+> !本书要求读者具有C++基础
> !未翻译的条款名称现在直译,翻译时可能适当修改
> !条款后的revised表明该条款已经经过初步修订
@@ -18,7 +20,7 @@ 1. [Item 7:区别使用()和{}创建对象](https://github.com/racaljk/EffectiveModernCppChinese/blob/master/3.MovingToModernCpp/item7.md) 2. [Item 8:优先考虑nullptr而非0和NULL](https://github.com/racaljk/EffectiveModernCppChinese/blob/master/3.MovingToModernCpp/item8.md) 3. [Item 9:优先考虑别名声明而非typedefs](https://github.com/racaljk/EffectiveModernCppChinese/blob/master/3.MovingToModernCpp/item9.md) - 4. Item 10:优先考虑域内enum而非域外enum + 4. [Item 10:优先考虑限域枚举而非未限域枚举](https://github.com/racaljk/EffectiveModernCppChinese/blob/master/3.MovingToModernCpp/item10.md) _updating_ 5. Item 11:优先考虑使用delete而非使用未定义的私有声明 6. Item 12:使用override声明重载函数 7. Item 13:优先考虑const_iterator而非iterator @@ -56,12 +58,3 @@ 8. 微调 1. Item 41:对于那些可移动总是被拷贝的形参使用传值方式 2. Item 42:考虑就地创建而非插入 - -## 翻译相关 -+ constness译为常量性,volatitleness译为易变性,reference-ness视情况直接译为引用 -+ built-in译为内置而不是内建 -+ literal译为字面值 -+ 诚恳接受typo-pull-request以及错译pr -+ 我蒟多线程方面(7.)基础薄弱,所幸译前还有大量时间进行知识储备 -+ 翻译到后面我觉得要想坚持不写译注几乎不可能,所以译注将会以_[num]_标出,详细内容将会出现在文末。 -+ :) \ No newline at end of file