在 ctor 的初始化列表中使用算术是否稳定?
Is it stable to use arithmetic in a ctor's initialization list?
在隐式赋值期间(没有重载操作符)在类的函数初始化列表中使用这样的东西是稳定的吗?
class C{
public:
C(int _var): var(_var), i(var*var)
{}
private:
int var;
int i;
};
我得到了一些不稳定的结果,这是为什么?
可以。
您可能想要摆脱初始化顺序依赖,并写入:
C(int _var): var(_var), i(_var*_var)
基本上,通过使i依赖于var,您必须确保在类中var在i之前声明。
同样,您可以在C中初始化在父类中定义(和初始化)的东西,因为父类将在C之前构造。
最佳实践要求您了解上述内容,并避免混淆任何情况-可能记录i对var的依赖,以便下一个程序员(可能是您自己)不会引入初始化顺序问题。
假设乘法不溢出,该代码具有定义的含义。
请注意,它严重依赖于var
在类中的i
之前定义的事实(初始化列表中的顺序无关紧要,重要的是成员本身定义的顺序)。否则i
将使用初始化的数据成员var
进行初始化。
但是如果你在代码中得到不稳定的行为,那么错误就在别处。
是的,这是安全的,但在这种情况下你必须小心。您正在使用var
而不是_var
,因此您必须确保var
在i
之前构建。这里就是这种情况,因为成员是按照声明的顺序构造的(在本例中是var
, i
),这可能与它们在初始化列表中出现的顺序不同。
在这个例子中它是有效的。在这种情况下也可以:
C(int _var): i(var*var), var(_var)
但不在此:
class C{
public:
C(int _var): var(_var), i(var*var)
{}
private:
int i;
int var;
};
当然,为了安全起见,你可以直接使用_var
:
C(int _var): var(_var), i(_var*_var)
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 委派的 ctor 是否受参数计算顺序的影响?
- 由于 C++17 支持数组shared_ptr,这是否意味着在 ctor 和重置中不再需要 T[] 的显式删除器?
- 虚拟 CTOR 的克隆函数实现是否有问题
- 是否有任何情况下,具有已删除CTOR的课程可能有用
- 是否应在调用基本CTOR时复制继承的构造函数
- 是否可以使用 lambda 初始化变量(删除复制 ctor 时)
- GCC 4.4.1是否存在错误,因为它不接受ctor初始值设定项中的注入类名
- 移动 ctor 是否在所有情况下都有效
- 显式移动 ctor 是否消除了隐式复制 ctor
- 复制列表初始化是否在概念上调用复制 ctor
- 在 ctor 的初始化列表中使用算术是否稳定?