小编Rim*_*imo的帖子

为什么允许T()= T()?

我相信表达式T()创建了一个rvalue(由标准).但是,以下代码编译(至少在gcc4.0上):

class T {};

int main()
{
    T() = T();
}
Run Code Online (Sandbox Code Playgroud)

我在技术上知道这是可能的,因为成员函数可以在temporaries上调用,而上面只是调用operator =在从第一个创建的rvalue临时T().

但从概念上讲,这就像为rvalue分配一个新值.是否允许这样做有充分的理由吗?

编辑:我发现这个奇怪的原因是它在内置类型上被严格禁止,但允许在用户定义的类型上使用.例如,int(2) = int(3)不会编译,因为这是"赋值中的无效左值".

所以我想真正的问题是,这种有点不一致的行为是否构成了语言的原因?还是出于某种历史原因?(例如,在rvalue表达式上只允许调用const成员函数在概念上会更健全,但是这可能无法完成,因为这可能会破坏一些现有代码.)

c++ language-design operator-overloading rvalue temporary-objects

18
推荐指数
4
解决办法
717
查看次数

pImpl成语和可测试性

c ++中的pImpl惯用法旨在从该类的用户隐藏类的实现细节(=私有成员).但是它也隐藏了该类的一些依赖关系,从测试的角度来看,这通常被认为是不好的.

例如,如果类A隐藏其类AImpl中的实现细节,只能从A.cpp访问,并且AImpl依赖于许多其他类,则单元测试类A变得非常困难,因为测试框架无法访问AImpl也没办法将依赖注入AImpl.

有没有人遇到过这个问题?你找到了解决方案吗?

- 编辑 -

在一个相关的主题上,似乎人们建议应该只测试由接口而不是内部公开的公共方法.虽然我可以在概念上理解该语句,但我经常发现我需要单独测试私有方法.例如,当公共方法调用包含一些非平凡逻辑的私有帮助器方法时.

c++ testing pimpl-idiom

17
推荐指数
4
解决办法
3213
查看次数

const返回类型何时干扰模板实例化?

来自Herb Sutter的GotW#6

对于非内置返回类型,返回值通常应为const....

注意:Lakos(第618页)反对返回const值,并指出它对于内置函数来说是多余的(例如,返回"const int"),他注意到这可能会干扰模板实例化.

虽然Sutter似乎不同意在使用Lakos按值返回非构建类型的对象时是返回const值还是非const值,但他通常同意返回内置类型的const值(例如const int) )不是一个好主意.

虽然我理解为什么这是无用的,因为返回值不能被修改,因为它是一个右值,我找不到一个如何干扰模板实例化的例子.

请举例说明如何使用返回类型的const限定符可能会干扰模板实例化.

c++ templates const return-value

5
推荐指数
1
解决办法
376
查看次数