在一个定义良好的非构造"对象"上调用非虚拟成员函数?

Joh*_*hnB 6 c++

在构造函数内部,允许调用非虚拟成员函数.

从这个事实可以看出,以下代码是明确定义的吗?

struct A {
    void foo { std::cout << "Hi there! My address is: " << this; }
};

A * a = nullptr;
a->foo ();
Run Code Online (Sandbox Code Playgroud)

回答?

借助评论中给出的一些链接以及链接页面中给出的链接,我现在认为答案可以在例如

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3035.pdf

§3.8标准杆 5,p.66:

"在对象的生命周期开始之前,但在对象将占用的存储空间被分配之后... [t]如果指针用于访问非静态数据成员,则程序具有未定义的行为或者调用对象的非静态成员函数"

如果根本没有分配存储,那么调用成员函数应该更加未定义.

我想这里有一个很重要的原因可以让它定义为未定义:https://stackoverflow.com/a/3257755/1419315

650*_*502 4

该代码是未定义的行为。

请注意,在构造函数内部您还可以调用虚拟成员函数。

有点棘手的部分是在构造函数代码开始之前在成员初始化期间调用虚拟成员函数。仍然有效,但发生的情况并不明显(重点是,在构造函数代码开始之前,对象尚未被视为其类的实例,并且虚拟成员函数被分派到基类)。

this如果您在成员初始化列表中使用,某些编译器会发出警告,因为this指针在该点上的行为会很奇怪(只有在构造函数启动后,它才会开始正常行为)。

该代码显然有效,因为大多数编译器使用 VMT 方法进行方法分派,但不需要 VMT 来调用非虚拟方法,因此如果方法代码不以任何方式取消引用,this那么事情似乎“有效”。然而,该代码似乎可以在某个实现中(甚至在每个实现中)运行这一事实仍然不能使其成为合法的 C++ 代码。


归档时间:

查看次数:

171 次

最近记录:

12 年,7 月 前