gpt4 book ai didi

c++ - C++ CRTP初始化

转载 作者:行者123 更新时间:2023-12-01 14:57:52 25 4
gpt4 key购买 nike

我遇到了运行以下程序的段错误

#include <iostream>
#include <vector>

template <typename Derived>
struct CRTPBase {
CRTPBase() {
func();
}
void func() {
static_cast<Derived*>(this)->_func();
}
};
struct CRTPChild : CRTPBase<CRTPChild>{
using CRTPBase<CRTPChild>::CRTPBase;
void _func(){
vec.resize(10);
vec[0] = 2;
}
std::vector<int> vec;
};
int main()
{
CRTPChild obj;
std::cout << obj.vec[0] << std::endl;
}

当我用 vec类型的成员替换 int时,它不再存在段错误。为什么?

最佳答案

您的代码具有未定义的行为。问题来自order of the initialization;对于派生类CRTPChild,首先调用基类CRTPBase<CRTPChild>的构造函数,然后初始化vec的数据成员CRTPChild。调用_func时(从基类的构造函数中),vec根本没有初始化。

2) Then, direct base classes are initialized in left-to-right order as they appear in this class's base-specifier list

3) Then, non-static data members are initialized in order of declaration in the class definition.



将类型更改为 int仍然是 UB。 UB意味着一切皆有可能,它可能导致段错误,也可能不会。

关于c++ - C++ CRTP初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61000594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com