c++ - 是否在定义明确的非构造 "object"上调用非虚拟成员函数?

标签 c++

在构造函数中,允许调用非虚拟成员函数。

根据这个事实是否可以得出以下代码段是明确定义的?

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

A * a = nullptr;
a->foo ();

回答?

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

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

§3.8 标准杆。 5,页。 66:

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

那么如果根本没有分配存储就调用一个成员函数应该更未定义。

我想这里解释了为什么将其设为未定义是个好主意的一个重要原因:https://stackoverflow.com/a/3257755/1419315

最佳答案

该代码是未定义的行为。

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

有点棘手的部分是在构造函数代码开始之前的成员初始化期间调用虚拟成员函数。仍然有效,但不清楚发生了什么(关键是在构造函数代码开始之前,对象还不被视为其类的实例,并且虚拟成员函数被分派(dispatch)到基类)。

如果你在成员初始化列表中使用 this ,一些编译器会发出警告,因为 this 指针在那个时候会表现得很奇怪(它只会在之后开始表现正常构造函数的开始)。

代码显然有效,因为大多数编译器使用 VMT 方法进行方法分派(dispatch),但不需要 VMT 来调用非虚方法,因此如果方法代码不以任何方式解除引用this 然后事情似乎“有效”。然而,代码似乎在一个实现中(或者甚至在与此相关的每个实现中)都有效的事实仍然不能使其成为合法的 C++ 代码。

关于c++ - 是否在定义明确的非构造 "object"上调用非虚拟成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20829889/

相关文章:

c++ - constexpr 构造函数可能永远不会被 constexpr 实例化

c++ - Eclipse:注释整个代码而不会被其他注释打断

c++ - 如何从文件中读取整数到动态数组

c++ - 从类内部线程化成员函数

c++ - 编写此指针函数代码的长格式是什么?

c++ - 删除 vector<vector<Class>> 线程安全吗?

c++ - 解决交叉引用

c++ - 在哪里放置 2 个文件的辅助函数?

c++ - 如何为 vector 内部的 vector 创建指针?

c++ - 来自第 3 方静态库的回调中未捕获的异常