gpt4 book ai didi

c++ - 在对象生命周期内显式调用构造函数和虚函数

转载 作者:行者123 更新时间:2023-11-28 06:43:12 25 4
gpt4 key购买 nike

我们可以使用限定名调用构造函数,尽管构造函数没有名称。确实 3.4.3.2/2:

In a lookup in which function names are not ignored and the nested-name-specifier nominates a class C:

— if the name specified after the nested-name-specifier, when looked up in C, is the injected-class-name of C (Clause 9), or

[...]

the name is instead considered to name the constructor of class C.

考虑以下示例:

#include <iostream>

using std::cout;
using std::endl;

struct A
{
virtual void foo()
{
cout << "A" << endl;
}

A(){ }
};

struct B : A
{
virtual void foo()
{
cout << "B" << endl;
}

B()
{
foo();
}
};

struct C : B
{
virtual void foo()
{
cout << "C" << endl;
}

C() : B(){ }
};

C c;

int main()
{
c.foo();
C::C(); // Prints B
}

demo

C::C() 行打印 B。但不清楚。第 12.7/4 节说:

When a virtual function is called directly or indirectly from a constructor or from a destructor, including during the construction or destruction of the class’s non-static data members, and the object to which the call applies is the object (call it x) under construction or destruction, the function called is the final overrider in the constructor’s or destructor’s class and not one overriding it in a more-derived class

在显式构造函数调用中,c 已经完全构造。所以我引用的规则不能用来解释这种行为。是UB吗?你能解释一下吗?

最佳答案

We can call a constructor using qualified-name, although the constructor doesn't have a name.

你的前提是完全错误的。在您引用的非常相同的段落中 (§3.4.3.1 [class.qual]/p2):

Such a constructor name shall be used only in the declarator-id of a declaration that names a constructor or in a using-declaration.

C::C(); 是命名构造函数的声明吗?不是。它是 using-declaration 吗?很明显不是。

它的格式不正确。 Clang 似乎考虑用它来命名类型,出于某种原因 - 可能是一个错误(它对 injected-class-names 的处理在其他方面也是错误的)。


我也不知道您是如何得出 C::C(); 行为的结论的 - 顺便说一下,只有考虑 C::C 来命名类型 - 可能会受到 c 状态的影响,它在表达式或任何相关函数中都没有出现。

一个假设的对对象的显式构造函数调用必须看起来像 c.C::C();,因为构造函数是一个非静态成员函数。允许您在已构造的对象上调用构造函数是没有任何意义的 - 这甚至意味着什么?

关于c++ - 在对象生命周期内显式调用构造函数和虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25541010/

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