如果减速初始化的类成员在初始化列表中,是否会在构造函数中再次初始化?

问题描述 投票:0回答:1

我有这门课:

class A 
{
    bool isSomthing{true};
    A() : isSomthing{isSomthingFunc()}{};
    bool isSomthingFunc() {return isSomthing && isSomthingFuncExt()};
}

有人可以解释一下,如果

isSomething
返回 false,
isSomthingFuncExt()
的值会是多少(如果
isSomthingFuncExt()
返回 val 是 constexpr 会发生什么,如果不是的话会怎样)?

c++ compilation initialization
1个回答
2
投票

您的代码调用了未定义的行为。

这个例子似乎是为了说明对如何使用初始化器的一些错误且非常全面的理解而编造的。然而,它实际上相当简单:仅当成员初始值设定项列表中没有初始值设定项时才使用默认初始值设定项。因此,在您的示例中,构造函数中未使用默认初始值设定项。

构造函数

A() : isSomthing{isSomthingFunc()}{};

使用

isSomethingFunc()
来初始化成员。它不使用类内默认
true
初始化器。

你可以写出同样的效果:

class A 
{
    bool isSomthing;  // no default initializer !!
    A() : isSomthing{isSomthingFunc()}{};
    bool isSomthingFunc() {
        return isSomthing &&          // UB: reading before initialization
               isSomthingFuncExt()
    };
};

调用

isSomthingFunc
会调用未定义的行为,因为它在初始化之前从成员中读取。

© www.soinside.com 2019 - 2024. All rights reserved.