gpt4 book ai didi

c++ - 在初始化列表中使用 this

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

假设我有一个类 Baz,它按顺序继承自类 FooBarBar 类的构造函数采用指向 Foo 对象的指针。我想做的是将 this 作为 Foo 对象传递给 Bar 构造函数:

Baz () : Foo(), Bar(this) {}

一个工作示例:

#include <iostream>
class Bar;
class Foo {
public:
virtual ~Foo() {}
virtual void parse_bar (Bar&) const = 0;
};

class Bar {
private:
const Foo * parser;
public:
Bar (const Foo * parser_in) : parser(parser_in) {}
virtual ~Bar() {}
void parse_self () { parser->parse_bar (*this); }
};

class Baz : public Foo, public Bar {
public:
Baz () : Foo(), Bar(this) {}
virtual void parse_bar (Bar &) const { std::cout << "Hello World\n"; }
};

int main () {
Baz baz;
baz.parse_self();
}

这恰好适用于我的计算机和我的编译器(用其中几个进行了测试)。然而,2003 年标准的第 9.3.2 节让我有点不安,因为我可能只是走运,以这种方式使用 this 是未定义的行为。严格来说,初始化列表在构造函数体之外。这是相关的文字,强调我的:

9.3.2 The this pointer
In the body of a nonstatic member function, the keyword this is a non-lvalue expression whose value is the address of the object for which the function is called.

那么我的使用是合法且定义明确的,还是未定义的行为?

最佳答案

在这种情况下有两点需要注意。

首先,在构造函数初始化列表中,this 指针指向一个未构造(或未完全构造)的对象。访问这样的指针是可以的,但是它所指向的对象只能以有限的方式使用。参见语言规范中的 12.7。

其次,在您的特定示例中,您实际上正在做的是在尝试任何访问之前将 this 指针转换为 Foo * 类型。这是完全安全的,因为到那时 Foo 子对象已完全构建。 (我假设,无论访问将遵循什么,如果有的话,将仅限于完全构造的 Foo 子对象)。

这种情况下唯一需要关注的是将 this 转换为 Foo * 类型是否合法,即转换过程本身是否应该成功。答案是:是的,在普通(非虚拟)继承的情况下,这种转换是完全合法和安全的(同样,在 12.7 中明确允许)

关于c++ - 在初始化列表中使用 this,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11333671/

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