【发布时间】:2016-02-25 12:51:22
【问题描述】:
根据我获得的here 的答案,尽管clang 和vs2015 接受了它,但下面的代码格式不正确。
#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 命名构造函数有什么用处,就像上面 A 类中的 (using B::B;) 一样。请注意,这个 using-declaration 在这种情况下是完全不相关的,无论 B 是否是 A 的基类。
【问题讨论】:
标签: c++ constructor language-lawyer c++14