为什么定义静态成员变量时不遵循定义顺序?

2024-01-05

我知道来自不同翻译单元的静态变量的初始化顺序问题。然而,我的问题是在一个翻译单元内,实际上是在一个结构内:

template <int size>
struct SlidingTile {
    using AllActions = std::array<int, size>;
    using AllMDDeltas = std::array<int, size>;

    int mdDelta(int i) const {
        return mdDeltas_[i];
    }

    static AllActions computeAllActions() {
        std::cout << "computeAllActions" << std::endl;
        AllActions res;
        for (int i = 0; i < size; ++i) res[i] = i;
        return res;
    }

    static AllMDDeltas computeAllMDDeltas() {
        std::cout << "Entered computeAllMDDeltas" << std::endl;
        AllActions res;
        for (int i = 0; i < size; ++i) res[i] = 10 * allActions_[i];
        std::cout << "Exiting computeAllMDDeltas" << std::endl;
        return res;
    }

private:
    static const AllActions allActions_;
    static const AllMDDeltas mdDeltas_;
};

template <int size>
const typename SlidingTile<size>::AllActions
    SlidingTile<size>::allActions_ = SlidingTile<size>::computeAllActions();

template <int size>
const typename SlidingTile<size>::AllMDDeltas
    SlidingTile<size>::mdDeltas_ = SlidingTile<size>::computeAllMDDeltas();

int main() {
    SlidingTile<3> s;
    std::cout << s.mdDelta(2) << std::endl;
    return 0;
}

输出是:

Entered computeAllMDDeltas
Exiting computeAllMDDeltas
computeAllActions

出乎我的意料,computeAllMDDeltas之前接到电话computeAllActions and so allActions_使用时未初始化computeAllMDDeltas。有趣的是,computeAllActions即使当allActions_用于computeAllMDDeltas.

为什么会发生这种情况?在这种情况下建议的方法是什么?


为什么定义静态成员变量时不遵循定义顺序?

因为标准说初始化是无序的:

[basic.start.init] /2(N4140标准草案)

...显式专用类模板静态数据成员的定义已有序初始化。其他类模板静态数据成员(即隐式或显式实例化的专业化)具有无序 初始化. ...


在这种情况下建议的方法是什么?

与跨翻译单元的初始化相同:首次使用时构建 idiom:

struct SlidingTile {
    // ...
private:
    static const AllActions& allActions() {
        static const AllActions instance = computeAllActions();
        return instance;
    }
    static const AllMDDeltas& mdDeltas() {
        static const AllMDDeltas instance = computeAllMDDeltas();
        return instance;
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么定义静态成员变量时不遵循定义顺序? 的相关文章

随机推荐