Coder Social home page Coder Social logo

effectivemoderncppchinese's Introduction

《Effective Modern C++ 》翻译

Backers on Open Collective Sponsors on Open Collective

目录

  1. 简介
  2. 类型推导
    1. Item 1:理解模板类型推导 已修订
    2. Item 2:理解auto类型推导
    3. Item 3:理解decltype
    4. Item 4:学会查看类型推导结果
  3. auto
    1. Item 5:优先考虑auto而非显式类型声明
    2. Item 6:auto推导若非己愿,使用显式类型初始化惯用法
  4. 移步现代C++
    1. Item 7:区别使用()和{}创建对象 已修订
    2. Item 8:优先考虑nullptr而非0和NULL
    3. Item 9:优先考虑别名声明而非typedefs
    4. Item 10:优先考虑限域枚举而非未限域枚举 已修订
    5. Item 11:优先考虑使用deleted函数而非使用未定义的私有声明
    6. Item 12:使用override声明重载函数
    7. Item 13:优先考虑const_iterator而非iterator
    8. Item 14:如果函数不抛出异常请使用noexcept
    9. Item 15:尽可能的使用constexpr
    10. Item 16:让const成员函数线程安全
    11. Item 17:理解特殊成员函数的生成
  5. 智能指针
    1. Item 18:对于独占资源使用std::unique_ptr
    2. Item 19:对于共享资源使用std::shared_ptr 已修订
    3. Item 20:当std::shared_ptr可能悬空时使用std::weak_ptr
    4. Item 21:优先考虑使用std::make_unique和std::make_shared,而非直接使用new
    5. Item 22:当使用Pimpl惯用法,请在实现文件中定义特殊成员函数
  6. 右值引用,移动语义,完美转发
    1. Item 23:理解std::move和std::forward
    2. Item 24:区别通用引用和右值引用
    3. Item 25:对于右值引用使用std::move,对于通用引用使用std::forward
    4. Item 26:避免重载通用引用
    5. Item 27:熟悉重载通用引用的替代品
    6. Item 28:理解引用折叠
    7. Item 29:认识移动操作的缺点
    8. Item 30:熟悉完美转发失败的情况
  7. Lambda表达式
    1. Item 31:避免使用默认捕获模式
    2. Item 32:使用初始化捕获来移动对象到闭包中
    3. Item 33:对于std::forward的auto&&形参使用decltype
    4. Item 34:优先考虑lambda表达式而非std::bind
  8. 并发API
    1. Item 35:优先考虑基于任务的编程而非基于线程的编程
    2. Item 36:如果有异步的必要请指定std::launch::async
    3. Item 37:从各个方面使得std::threads unjoinable
    4. Item 38:关注不同线程句柄析构行为
    5. Item 39:考虑对于单次事件通信使用void
    6. Item 40:对于并发使用std::atomic,volatile用于特殊内存区
  9. 微调
    1. Item 41:对于那些可移动总是被拷贝的形参使用传值方式
    2. Item 42:考虑就地创建而非插入

其他资源

贡献者

感谢所有参与翻译/勘误/建议的贡献者们~

免责声明

译者纯粹出于学习目的与个人兴趣翻译本书,不追求任何经济利益。译者保留对此版本译文的署名权,其他权利以原作者和出版社的主张为准。本译文只供学习研究参考之用,不得公开传播发行或用于商业用途。有能力阅读英文书籍者请购买正版支持。

effectivemoderncppchinese's People

Contributors

allenmh avatar amoschenyq avatar andyjmr avatar blurrylight avatar bz521 avatar cellspace avatar deximy avatar ecer avatar gosth avatar icgw avatar jiapengwen avatar l-super avatar liuyunbin avatar lucienxian avatar misteo avatar neko-horikawaraiko avatar pusidun avatar standback avatar sunyuhan19981208 avatar techlarry avatar weebowo avatar wendajiang avatar windski avatar xiaotaoguo avatar xiaoxkkk avatar xris1658 avatar y1yang0 avatar yingang avatar yiyuan-dong avatar zyuchuan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

effectivemoderncppchinese's Issues

Chapter 5:Item29.md

The first letter should not be capital. The sequence of files in chapter 5 is incorrect. 🙃

item 11中有句话没翻译

"This chapter is largely devoted to common practices in C++98 that have been superseded by better practices in C++11."

这句话两种翻译:
1.本节主要致力于讨论C ++ 98中的常见实践,这些实践已被C ++ 11中的更好的实践所取代。
2.本节主要致力于讨论C++98被C++11中更好的实践所取代的那些常见实践。

那种更好呢?个人感觉delete这节应该主要讨论的是C++11的东西,如果采用翻译1,则感觉像是在讨论C++98。

....

当然了,非常感谢大佬们的无私奉献。但是确实不少地方好像是机器翻译的,按照英文的思维来翻译。对新手很难。

chapter1: item3 "在这种形式下auto不再进⾏auto类型推导"

原文:
image
译文:
image

这里的翻译好像是错的。

原文的意思应该是
使用了这种声明形式, auto是要使用类型推导规则去推导他的类型的。更准确的说是编译器会从函数的实现去推导出函数的返回类型。

{简单的说就是, auto 是要使用函数 的实现,通过类型推导规则推导出函数的返回类型}

而译文,给出了相返的意思。“不推导类型”,应该是错误 的,

Item9中有如下一段翻译反了

std::remove_const::type // 从T中产出const T -----应为从const T产生T
std::remove_reference::type // 从T中产出T&和T&& ----应为重T&和T&&产生T
std::add_lvalue_reference::type // 从T&中产出T ---应为从T产生T&

Item17 中的关于deprecated的翻译问题

Item17多处对于 deprecated 这个词的翻译存在问题。一般会将其译为“过时的”,即当前标准仍支持,但是以后可能将其废弃(停止支持),而不是带着 is 将 is deprecated 译为“被废弃”。希望可以纠正这个小小的问题。

条款二十一中第三段的加粗错误

std::make_unique和std::make_shared是三个make函数中的两个:接收任意的多参数集合,完美转发到构造函数去动态分配一个对象,然后返回这个指向这个对象的指针。第三个make函数是std::allocate_shared。它行为和std::make_shared一样,只不过第一个参数是用来动态分配内存的allocator对象。

其中"make函数"被显示为**make函数**,没有加粗。

Bug: Item19

最后的 "Things to Remember" 第一条:
std::shared_ptr为任意共享所有权的资源**提供**一种自动垃圾回收的便捷方式

[item8]对run-of-the-mill的翻译有误

英文原版靠近结尾的部分:

The 0 passed in the call to lockAndCall was intended to represent a null pointer, but what actually got passed was a run-of-the-mill int.

run-of-the-mill意为“普通的,常规的,平平无奇的”,而不是译文中的“相差十万八千里”。

是否会有计划将项目部署在gitbook上

markdown阅读起来还是比较繁琐,尤其是目录置顶的设计对于快速跳转不是很友好。想请问下是否会有计划将项目部署在类似gitbook之类阅读体验比较友好的平台上。

条款11:誊抄错误

原文是:const void* 和 const char*

现在如果使用void*和char*调用processPointer就是无效的,按常理说const void*和const void*也应该无效,所以这些实例也应该标注delete:

条款30翻译润色

==========原文==========
给定我们的目标函数f和转发函数fwd,如果f使用某特定实参做一件事,但是fwd使用相同的实参做另一件事,完美转发就会失败:

f( expression ); //如果这个做某件事,
fwd( expression ); //但是这个做另外的某件事,fwd完美转发expression给f会失败
导致这种失败的实参种类有很多。知道它们是什么以及如何解决它们很重要,因此让我们来看看无法做到完美转发的实参类型。
============应该改为=============
给定我们的目标函数f和转发函数fwd,如果f使用某特定实参会执行某个操作,但是fwd使用相同的实参会执行不同的操作,完美转发就会失败

Item 13 中格式问题

typedef std::vector<int>::iterator IterT; 	// typetypedef
std::vector<int>::const_iterator ConstIterT; // defs

应改成

typedef std::vector<int>::iterator IterT;       // type-
std::vector<int>::const_iterator ConstIterT; // defs

[Item 1] 语句不通顺

item1一开始,如下图
image
红框中,改为:
ParamType是一个通用引用
更好一些。

条款17 有错误

条款17 请记住 第三条 拷贝构造函数仅当类没有显式声明拷贝构造函数时才自动生成,并且如果用户声明了移动操作,拷贝构造就是delete。拷贝赋值运算符仅当类没有显式声明拷贝赋值运算符时才自动生成,并且如果用户声明了移动操作,拷贝赋值运算符就是delete。当用户声明了析构函数,拷贝操作的自动生成已被废弃。

最后一句,当用户声明了析构函数,拷贝操作的自动生成已被废弃。

拷贝操作是不是应该改为移动操作。

typo:item24变量命名错误

item24中markdown源代码中第35行的val2应当是var2

第二种情况是auto声明符,它是从以上示例中拿出的:

auto&& val2 = var1;                 //var2是一个通用引用

第二章:编译器版本更新导致结果不正确

auto x1 = 27; //类型是int,值是27
auto x2(27); //同上
auto x3 = { 27 }; //类型是std::initializer_list,
//值是{ 27 }
auto x4{ 27 }; //同上

当gcc编译器大于5.0,auto x4{ 27 }; x4的类型是int 而不是initialized_list

`item3.md`内的一个链接未能正确建立

item3.md内的一个链接未能正确建立

如下代码块所示,item24116行的超链接未填充内容,应填充为https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/5.RRefMovSemPerfForw/item24.md

要想支持这样使用`authAndAccess`我们就得修改一下当前的声明使得它支持左值和右值。重载是一个不错的选择(一个函数重载声明为左值引用,另一个声明为右值引用),但是我们就不得不维护两个重载函数。另一个方法是使`authAndAccess`的引用可以绑定左值和右值,[Item24]()解释了那正是通用引用能做的,所以我们这里可以使用通用引用进行声明:

有意愿协作共同翻译么?

我已经阅读完了英文版的《Modern Effective C++》,有些晦涩难懂的地方希望找人交流,同时也有意愿共同翻译。
如果你有兴趣的话,我可以来翻译本书的一部分条款。

针对条款四十一中Widget::addName()三种传递方式中的值传递

针对该函数关于传入右值的使用解释

class Widget {                                  //方法3:传值
public:
    void addName(std::string newName)
    { names.push_back(std::move(newName)); }
    …
};

按值传递:无论传递左值还是右值,都必须构造newName形参。如果传递的是左值,...,如果传递的是右值,需要移动的开销。在函数的实现中,newName总是采用移动的方式到Widget::names。开销总结:左值...,右值实参两次移动。对比...。

如:Widget::addName(string("123")),应该是直接初始化一次(string("123")),移动构造函数一次(std::move(newName)->push_back),而不是右值实参两次移动

关于一段话的请教

image
这里想请教一下,ParamType不是通用引用类型吗,是原版这样说的,还是后来加上的。在第一个item里面的一段文字

Item37: TheadRAII的析构似乎并非异步

在ThreadRAII的实例代码下提到:

这份代码中,我们选择在ThreadRAII的析构函数中异步执行join的动作

~ThreadRAII() { if (t.joinable()) { if (action == DtorAction::join) { t.join(); } else { t.detach(); } } }

此处析构函数并非异步吧?
如果传入DtorAction为join,主线程应该会被ThreadRAII的析构阻塞,直到线程任务return。

Chapter3, Item10

比起使用非限域枚举,限域有很多可圈可点的地方,它避免命名空间污染,防止不经意间使用隐式转换。 (下面这句我没看懂,保留原文。。(是什么典故吗。。。)) In many cases, you may decide that typing a few extra characters is a reasonable price to pay for the ability to avoid the pitfalls of an enum technology that dates to a time when the state of the art in digital telecommunications was the 2400-baud modem.

这句话暴露了Scott的年龄。

这句话的意思就是:
大多数情况下,你应该会觉得多敲几个(几行)字符作为避免使用未限域枚举这种老得和2400波特率猫同时代技术的代价是值得的。

条款7 各种翻译错误

1 原文的两行注释合起来是一句话

意为:没有声明std::initializer_list的构造函数
image

2 此外条款7有一处把parse翻译成“决议”很不合适

image

原文的用词和句法都很确切易懂,作为译者应尽量保持这种风格,而不是刻意使用“决议”这类看似高级实则有害的词汇。

添加“高深莫测”的意味只会降低翻译质量。

3 又一处错误

红框内是多余的,导致注释无法理解:
image

4 没有区分括号和花括号

条款7的目标就是区分brace和parens,然而译文的“括号”既用于指代brace,又指代parens。造成混淆。

5 注释的翻译错误过多,必须对照原文才能理解

看起来译者并未读懂原文,也不理解各个例子的代码……

`item40.md`内的一个链接未能正确建立

item40.md内的一个链接未能正确建立

如下代码块所示,item4063行的超链接未填充内容,应填充为https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/7.TheConcurrencyAPI/item39.md

RMW操作不是仅有的`std::atomic`在并发中有效而`volatile`无效的例子。假定一个任务计算第二个任务需要的一个重要的值。当第一个任务完成计算,必须传递给第二个任务。[Item39]()表明一种使用`std::atomic<bool>`的方法来使第一个任务通知第二个任务计算完成。计算值的任务的代码如下:

第三章 Item7: 誊抄错误

示例引用中注释部分:

Widget w4{10, 5.0};     //使用花括号初始化,但是现在
                        //调用std::initializer_list版本构造函数
                        //(10 和 true 转化为long double)

应为:

Widget w4{10, 5.0};     //使用花括号初始化,但是现在
                        //调用std::initializer_list版本构造函数
                        //(10 和 5.0 转化为long double)

或许可以重新做一份中文pdf整合了?

发现中文合集都是去年1月的事情了,这中间的修改还挺多的,所以希望管理员可以重新上传一份中文整合?因为我并不知道具体格式(中文或者字体啥的问题?)所以并不好个人制作一份commit上去。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.