gpt4 book ai didi

c++ - 将此作为参数传递给 C++ 中的成员

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:37:30 27 4
gpt4 key购买 nike

我想像这样将 this 作为参数传递给成员变量:

template<class T>
struct fun
{
fun(T* pointer) : memberPointer(pointer)
{
}
T* memberPointer;
};

struct gun
{
gun() : member(this)
{
}
fun<gun> member;
};

在 Visual Studio 中我有下一个警告:warning C4355: 'this' : used in base member initializer list

你能解释一下为什么这样做是错误的吗?我只是将指针存储在成员构造函数中,以便稍后使用它从 fun 调用一些 gun 函数。

最佳答案

潜在的问题是this 指向一个尚未完全构造的对象。例如,如果你有这个:

template<class T>
struct fun
{
fun(T* pointer) : memberPointer(pointer)
{
memberPointer->callMethod(); //this is 2nd to execute
}

T* memberPointer;
};

struct gun
{
gun() : member(this) //this is 1st to execute
{
ptr = new char(); // this is 4rd to execute unless earlier UB prevents execution
}
void callMethod()
{
printf("%s", ptr); //this is 3rd to execute, you get UB here
}
fun<gun> member;
char* ptr;
};

你会遇到未定义的行为,因为你会传递一个指向未完全构造的对象的指针,而应该传递一个指向完全构造的对象的指针。我故意用 UB 编写了一些蹩脚的代码以使其更具说服力,在现实生活中你不一定会遇到 UB 问题,有时所有对象都处于有效状态,因此你会遇到一些非常微妙的初始化顺序错误。

那不是你的情况。你的情况很好 - 你不关心对象尚未完全构建。但是,您在更改代码时应该小心,以免进入上述情况。

关于c++ - 将此作为参数传递给 C++ 中的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15804747/

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