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

标签 c++

我想像这样将 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/

相关文章:

c++ - SSE2 按 vector 移动

c++ - 用C++将OpenCV帧写入磁盘:单线程写入速度是否受磁盘吞吐量的限制?

c++ - 避免根据模板运算符的存在来编译某些行

c++ - 在 Windows XP 中使用 C++ 获取主音量

c++ - LLVM 优化器不能处理简单的情况?

c++ - 为 find_if 重载函数调用运算符 ()

android - 如何使用 getApplicationJniMethodId 发送一个 int 作为参数?

c++ - 与模板方法的接口(interface)

c++ - 我在哪里可以下载到 GNU C++ 标准库的源代码?

c++ - 如何在不拼接的情况下从其基类指针复制继承类?