问题标签 [effective-c++]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - c++ : && 是什么意思
我是 c++ 新手,我正在阅读有效的现代 c++,但我不明白这部分
在处理右值引用类型的参数时记住这一点尤其重要,因为参数本身是一个左值:
c++ - 函数指针的赋值(有效的 c++ item 35)
在有效的 c++ 中,第 35 条,作者通过函数指针介绍了策略模式。具体见第 172 页
在第六行,为什么对函数指针的赋值HealthCalcFunc
是defaultHealthCalc
而不是&defaultHealthCalc
?
c++ - Effective C++: Item 41 - 关于隐式接口的混淆
我正在阅读 Effective C++,第 41 项,标题为“理解隐式接口和编译时多态性”,它给出了这个例子和接下来的解释,但我不明白这部分。
...,T 必须支持一个 size 成员函数,......,但是这个成员函数不需要返回一个整数类型。它甚至不需要返回数字类型。就此而言,它甚至不需要返回
>
定义了运算符的类型!它需要做的就是返回一个 x 类型的对象,这样就有一个>
可以用 x 类型的对象和一个 int 调用的运算符。
您能否解释一下它的含义并提供更多示例?
memcpy - strncpy/memcpy/memmove 是逐字节还是以其他有效方式复制数据?
众所周知,在 x86/x86_64 等多字节字计算机中,逐字复制/移动大量内存(每步 4 或 8 个字节)比逐字节复制/移动更有效。
我很好奇 strncpy/memcpy/memmove 会以哪种方式做事,以及它们如何处理内存字对齐。
c++ - 在独立语句中将新对象存储在智能指针中
我正在阅读Effective C++ 第 3 版的第 17 项。
其中提到了为函数调用执行参数的顺序:
可:
1) 执行“new Widget” 2) 调用优先级 3) 调用 tr1::shared_ptr c'tor。
在最新的 C++ 编译器中真的是这样吗?我的意思是,我强烈认为编译器应该一个接一个地调用步骤 1 和 3,而不像上面的情况,因为它只有一个参数。如果我的理解有误,请纠正我。另外,如果有人问这个问题,您可以将其重定向到该页面,因为我在 SO 中没有找到任何内容。
c++ - 关于 std::cout,为什么使用“extern”而不是“单例模式”
我阅读了第 04 项提到的有效 C++
通过用本地静态对象替换非本地静态对象来避免跨翻译单元的初始化顺序问题。
我认为“全局且只有一个对象”应该是单例模式,而不是我阅读此项目后的外部对象。
比如 I/O 对象(std::cout)
但 std::cout 似乎是外部对象。(http://www.cplusplus.com/reference/iostream/cout/)
我对此感到困惑。
编辑:添加代码
我从这本书中捕获了一些代码。
首先是糟糕的代码:
在不同翻译单元中定义的非局部静态对象的相对初始化顺序是未定义的。
所以当我调用 tfs.
因为 tfs 可能没有完成初始化。
推荐代码:
c++ - 理解 Scott Meyers 的第三个 std::weak_ptr 例子
Effective Modern C++第 137 页的最后一个示例描绘了一个数据结构的场景,其中包含对象A
、对象B
和对象,C
它们通过std::shared_ptr
以下方式相互连接:
对我来说,这意味着对象和实例的类(通常是两个不相关的类)必须包含一个成员。A
C
std::shared_ptr<classOfB>
然后假设我们需要一个从B
back 到的指针A
,并列出了可用的选项:指针可以是原始的、共享的或弱的,最后一个被选为最佳候选者。
我确实理解前两种选择的弱点(啊哈),但我也看到第三种选择要求该成员A
已经由 some 管理std::shared_ptr
,否则怎么能std::weak_ptr
指出它呢?
然而,这本书并没有提到这个“限制”/假设/无论如何,所以事实是
- 我错了
- 我是对的,但出于某种我不明白的原因,这个假设很明显
std::weak_ptr
由于 a需要一个已经存在于同一个对象的确切原因,这个假设是显而易见的std::shared_ptr
,但我认为它在示例开头甚至没有提到它有点奇怪。
我问这个问题是为了理解这一点。
c++ - 什么是 EMC++ 中提到的“源对象是左值”场景,其中移动语义没有提供效率增益
Effective Modern C++ 中的第 29 项,Scott Meyers 列出了移动语义不会提高代码性能的三个场景,
[…] 移动语义对你没有好处:
- 无移动操作:要移动的对象无法提供移动操作 […]
- 移动不快: […] 移动操作不比其复制操作快。
- 移动不可用:上下文 […] 需要一个不发出异常的移动操作,但该操作未声明
noexcept
。
前面几页都解释清楚了,然后再加一个
[…] 移动语义没有提供效率增益的另一种情况:
- 源对象是左值:除了极少数例外(参见条款 25),只有右值可以用作移动操作的源。
(第 25 项的标题为Use std::move
on rvalue references 和std::forward
on Universal references,但我看不出它与交叉引用它的项目符号点有何关系。)
在此之后,文本基本上回到了对该项目的总结,没有进一步提及第四个要点。
那个要点是指什么?
据我了解移动语义,即使我想从左值移动,比如说x
,我仍然需要通过std::move(x)
(或等效的static_cast
)将它转换为右值,所以我在技术上仍然从右值移动(特别是 xvalue在这种情况下),而不是左值。
所以我很想说左值不能是移动操作的源对象。
我对这个话题缺少什么?
c++ - 通过初始化捕获的默认 lambda 捕获模式是什么样的?
使用 lambdas,在 C++11 中,我们可以将默认捕获模式设置为按值/按引用,例如[=]
/ [&]
,对于某些变量,可选地后跟显式捕获,按引用/按值,例如[=,&this_is_by_ref]
或[&,this_is_by_value]
。
在 C++14 中,我们还可以通过移动进行显式捕获,例如[y = std::move(x)]
.
在Effective Modern C++的第 32 条第 3 段中,我读到
初始化捕获无法表达的一件事是默认捕获模式,[...]
作者最有可能指的是什么?
我们已经有办法通过复制或引用来捕获我们需要的所有变量。为什么我们要用x = y
表格来表达呢?
也许作者只是指“默认移动捕获”?[x = std::move(x), y = std::move(y), …]
与列出的正文中使用的所有变量一样的东西?