问题标签 [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.

0 投票
5 回答
980 浏览

c++ - 如何理解此声明中的 typedef

最近,我阅读了《Effective C++ 》一书,第 35 条中关于 typedef 的声明让我感到困惑。

所以我的第一个问题是:为什么作者在这里使用前向声明?有什么具体原因吗?

我的第二个问题是:我如何理解 typedef 声明,以及如何使用它?我只知道类似typedef int MyInt;

0 投票
2 回答
173 浏览

c++ - 推断类型

我在浏览 Scott Meyer 的 Effective Modern C++ 时试图理解类型推导。

考虑下面的代码片段:

他说,既然paramType是参考,我们可以按照两步程序来推断 的类型T

  1. expr忽略(即xcxrx)中的引用(如果有)
  2. 模式匹配的类型exprparamType

现在cx是什么时候const int

cx -> 常量整数

paramType -> 对 const int 的引用

那么,根据提到的逻辑,不T应该是const int由于模式匹配(而不仅仅是int)?我知道 的constnesscx已经传递给paramType,但他所说的是否有误?他提到的这个两步程序是否作为经验法则不能遵循?你怎么做呢?

谢谢!

0 投票
1 回答
94 浏览

c++ - 位矩阵相对于位图的优势

我想创建一个环境的简单表示,基本上只表示某个位置是否是对象。

因此,我只需要一个充满1“和0”的大矩阵。有效地处理这个矩阵很重要,因为我将对其进行随机定位的 get 和 set 操作,而且还要遍历整个矩阵。

什么是最好的解决方案?我的方法是创建一个包含位元素的向量向量。否则,使用位图会有优势吗?

0 投票
1 回答
275 浏览

c++11 - “Effective Modern C++”中的 C++ 默认移动操作

第 17 项:了解特殊成员函数生成。

  1. 仅针对缺少
    显式声明的移动操作、复制操作或析构函数的类生成移动操作。

  2. 现在,当我提到移动构造
    或移动分配数据成员或基类的移动操作时,
    不能保证移动会实际发生。
    实际上,“按成员移动”更像是按成员
    移动请求,因为未启用移动(...)的类型
    将通过其复制操作“移动”。

但是,我无法在我的环境中验证它们。


第一个断言可能因环境而异,但第二个断言几乎是错误的。
我对此感到非常困惑。请帮帮我。

0 投票
2 回答
951 浏览

c++11 - pimpl idiom的impl类可以有析构函数吗?

我在有效的现代cpp中学习pimpl,经过一番搜索,没有人谈论pimpl成语的impl类的析构函数,是不是没有必要?

0 投票
1 回答
75 浏览

c++ - 参考推论如何工作?

可能会重复到这个

我读了有效的现代 C++。在 下Item 1,我找到了一个通用参考的案例: 对于最后一个例子,我在 VS2013 下做了一个测试。在此处输入图像描述

f(27);

这是输出:

我发现在模板函数中,没有std::forward<T>(param),process(int& x)会被调用,但根据书本, for 的类型param应该是右值引用,所以process(int&& x)应该被调用。但这种情况并非如此。是我误解了什么吗?

这是我从其他线程中找到的转发参考: 在此处输入图像描述

0 投票
0 回答
140 浏览

c++ - STL 分配器的合法使用:Scott Meyers

我正在阅读 Scott Meyers 的有效 STL,第 11 项有以下关于分配器的文本。

分配器的实用程序,假设您有两个堆,由 Heap1 和 Heap2 类标识。每个堆类都有用于执行分配和释放的静态成员函数:

进一步假设您想将一些 STL 容器的内容放在不同的堆中。再次,没问题。首先,您编写一个分配器,旨在使用 Heap1 和 Heap2 等类进行实际内存管理

然后使用 SpecialHeapAllocator 将容器的元素聚集在一起:

在这个例子中,Heap1 和 Heap2 是类型而不是对象非常重要。STL 提供了一种语法,用于使用相同类型的不同分配器对象初始化不同的 STL 容器,但我不会向您展示它是什么。这是因为如果 Heap1 和 Heap2 是对象而不是类型,它们将是不等价的分配器,这将违反分配器的等价约束。

我上面的问题是

  1. “使用相同类型的不同分配器对象初始化不同的 STL 容器”的 STL 语法是什么?

  2. 为什么如果 Heap1 和 Heap2 是对象,它们是不等价的分配器?

0 投票
4 回答
160 浏览

c++ - 当两个对象相加而没有返回值优化时,会创建多少个临时对象?

在阅读了 Scott Meyers 的“More Effective C++”一书的第 20 和 22 条后,我决定提出这个问题。

假设您编写了一个类来表示有理数:

现在假设您决定operator+使用以下方法实现operator+=

我的问题是:如果禁用了返回值优化,会创建多少个临时变量operator+

我相信创建了 2 个临时对象:一个Rational(lhs)在 的主体内执行operator+,另一个在operator+通过复制第一个临时对象创建返回的值时。

当 Scott 介绍这个操作时,我产生了困惑:

并写道:“可能使用 3 个临时对象,每次调用一个operator+”。我相信如果禁用返回值优化,上面的操作将使用 6 个临时对象(每次调用 2 个operator+),而如果启用,上面的操作将根本不使用临时对象。斯科特是如何得出他的结果的?我认为这样做的唯一方法是部分应用返回值优化

0 投票
1 回答
77 浏览

c++ - 如何理解有效 C++ 中的“虚拟构造函数的实现”

在 Effective C++ 3rd, Item 31, p146-p147 中,它说

这一切都发生在包含虚拟构造函数实现的文件的幕后。

我不确定如何理解这个句子中的虚拟构造函数。

据我所知,C++ 中没有虚拟构造函数。

那么,这句话是有效 C++ 中的错误吗?

或者,这个虚拟构造函数是否引用了其他东西?

0 投票
0 回答
374 浏览

c++11 - C++ - 定义自定义 new 和 delete 运算符时 make_shared

关于 Scot Meyers 的《Effective Modern C++》一书,以及第 21 条:“Prefer std::make_unique and std::make_shared to direct use of new”:

“某些类定义了自己的 operatornew和 operator版本delete。通常,特定于类的例程仅设计为分配和释放与类对象大小精确匹配的内存块。这样的例程不适合std::shared_ptr's 对自定义的支持分配(通过std::allocate_shared)和释放(通过自定义删除器),因为std::allocate_shared请求的内存量不是动态分配对象的大小,而是该对象的大小加上控制块的大小。因此,使用 make 函数使用特定于类的 operatornew和 operator版本创建类型的对象delete通常是一个糟糕的主意。”

如果自定义和在与标准和相同的地方被调用,为什么这是allocate_shared/的问题?make_sharednewdeletenewdelete

构造:操作符new只是用来构造资源对象,而make_shared/allocate_shared构造了控制块。

销毁:指定或不指定自定义删除器函数,当delete被调用时,只应删除资源对象。控制块取决于引用和弱计数。

为什么然后这句话:“这样的例程不适合std::shared_ptr支持自定义分配(通过std::allocate_shared)和释放(通过自定义删除器),因为std::allocate_shared请求的内存量不是动态分配对象的大小,而是该对象的大小加上控制块的大小。”?