- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们可以使用限定名调用构造函数,尽管构造函数没有名称。确实 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
}
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/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!