施工报表

时间:2016-07-01 10:47:31

标签: c++ c++11

假设我们有一个类Foo,其中包含来自explicit的非int构造函数。然后执行以下功能:

Foo makeFoo1() { return 123; }
Foo makeFoo2() { return {123}; }

我认为makeFoo1要求Foo的复制/移动ctor可以访问,并且可能(尽管不太可能)编译器不会删除副本,因此导致真正的复制/移动。

对于makeFoo2,由于我们使用的是复制列表初始化,因此不会发生任何复制/移动。

我是否应该真的担心这个问题,并且尽可能地在非explicit ctors中加入支持(如makeFoo2中所述)? (假如我是图书馆作者,并希望该库与嵌入式系统的subpar编译器一起使用。)

1 个答案:

答案 0 :(得分:3)

我会在这里走出困境,将一个实际的答案和一个弱的语言 - 律师理由结合起来。

弱语言 - 律师论证:如果我正确理解this cppreference.com description,那么在使用初始化列表(makeFoo2)进行初始化时,不能保证RVO不仅仅是你的int返回({{ {1}})。所以,不要在大括号中包围你的int。

实际论点1:来吧,那些括号是多余的。他们应该是多余的。所以不要使用它们,这似乎不对。

实践论证2:最少惊喜的原则。使用这些括号,你暗示无支撑形式有问题。我会对括号感到困惑和惊讶(尽管不是很困惑)。

实际论点3:在这种情况下 - 信任编译器。这不是你的性能瓶颈所在(如果它是 - 使它成为内联函数,它不会;或者如果你有一个现有对象则使用引用;等等。)