gpt4 book ai didi

c++ - 试图理解 C++ 标准中的 [class.qual]/2

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:38:34 25 4
gpt4 key购买 nike

根据我得到的答案here ,尽管 clangvs2015 接受它,但下面的代码格式错误。

#include <iostream>
class A {
public:
A() { std::cout << "A()" << '\n'; }
};

int main()
{
A::A();
}

尽管如此,下面的代码似乎适用于所有 3 个编译器(参见 live example)。 AFAICT,根据 [class.qual/2] 代码格式错误。或者我在这里遗漏了什么?

#include <iostream>
struct B { B() { std::cout << "B()" << '\n'; } };
struct A : public B { };
int main()
{
A::B();
}

此外,根据 [class.qual]/2,下面的代码格式正确,在这种情况下,所有 3 个编译器都会产生预期的输出(参见示例 here)。

include <iostream>
struct B { B() { std::cout << "B()" << '\n'; } };
struct A : public B { using B::B; A() { std::cout << "A()" << '\n'; } void f() { B(); } };
int main()
{
A a;
a.f();
}

输出:

B()
A()
B()

但我想知道using-declaration 命名构造函数有什么用处,例如类中的构造函数(using B::B;) A 以上。请注意,此 using-declaration 在这种情况下完全不相关,无论 B 是否是 A 的基类。

最佳答案

我认为您的第二个样本格式正确。 [class.qual]/2 中的规则指出,如果在 中查找时在 nested-name-specifier 之后指定的名称,则该名称指的是构造函数CC 的注入(inject)类名。在 A::B 的情况下,在 nested-name-specifier 之后指定的名称是 B 的注入(inject)类名(由于继承可见),而不是A。在这种情况下,A::B 明确命名了一个类型,A::B() 创建了一个临时的 B 实例。

使用声明命名构造函数可用于提升带参数的基类构造函数:

struct B { B(int a) { std::cout << "B " << a << '\n'; } };
struct A : public B { using B::B; };
int main()
{
A a{1}; //would not be valid without the using-declaration
}

关于c++ - 试图理解 C++ 标准中的 [class.qual]/2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33870642/

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