【发布时间】:2016-03-29 19:56:33
【问题描述】:
我有以下代码:
struct S
{
S(): a(42) {}
int a;
};
class P
{
public:
P(S const *s): m_s(s ? *s : /*init m_s by default ctor - how to achieve it?*/)
private:
S m_s;
};
我希望 m_s 由复制构造函数或默认构造函数初始化,具体取决于指针 s:
P p1(nullptr); // expect default ctor: p1.m_s.a = 42
S s;
s.a = 84;
P p2(&s); // expect copy ctor: p2.m_s.a = 84
我怎样才能以最优雅的方式做到这一点?
【问题讨论】:
-
试试这个:
m_s(s ? *s : S())。不是最有效的,但这就是使用指针所付出的代价。 -
您可能无法以“最优雅的方式”进行操作。许多不优雅的解决方案同样在争夺第一名。
-
@n.m.为什么这不是最有效的?我希望编译器能够优化掉任何不必要的副本。
-
@ChrisDrew 我认为编译器不会优化显式调用的复制构造函数。不确定是否允许。
-
@n.m.它是允许的,并且将被优化。演示:goo.gl/XpVzVG
标签: c++ c++11 copy-constructor default-constructor