假设我们有一个类Foo
,其中包含来自explicit
的非int
构造函数。然后执行以下功能:
Foo makeFoo1() { return 123; }
Foo makeFoo2() { return {123}; }
我认为makeFoo1
要求Foo
的复制/移动ctor可以访问,并且可能(尽管不太可能)编译器不会删除副本,因此导致真正的复制/移动。
对于makeFoo2
,由于我们使用的是复制列表初始化,因此不会发生任何复制/移动。
我是否应该真的担心这个问题,并且尽可能地在非explicit
ctors中加入支持(如makeFoo2
中所述)? (假如我是图书馆作者,并希望该库与嵌入式系统的subpar编译器一起使用。)
答案 0 :(得分:3)
我会在这里走出困境,将一个实际的答案和一个弱的语言 - 律师理由结合起来。
弱语言 - 律师论证:如果我正确理解this cppreference.com description,那么在使用初始化列表(makeFoo2
)进行初始化时,不能保证RVO不仅仅是你的int返回({{ {1}})。所以,不要在大括号中包围你的int。
实际论点1:来吧,那些括号得是多余的。他们应该是多余的。所以不要使用它们,这似乎不对。
实践论证2:最少惊喜的原则。使用这些括号,你暗示无支撑形式有问题。我会对括号感到困惑和惊讶(尽管不是很困惑)。
实际论点3:在这种情况下 - 信任编译器。这不是你的性能瓶颈所在(如果它是 - 使它成为内联函数,它不会;或者如果你有一个现有对象则使用引用;等等。)