根据我在这里得到的答案,下面的代码虽然被clang
和vs2015
接受,但是其实是格式不正确的。
#include <iostream>
class A {
public:
A() { std::cout << "A()" << '\n'; }
};
int main()
{
A::A();
}
尽管下面的代码在三个编译器中似乎都可以工作(参见实时示例),但根据[class.qual/2]所述,该代码无法正确编译。我是否遗漏了什么?
#include <iostream>
struct B { B() { std::cout << "B()" << '\n'; } };
struct A : public B { };
int main()
{
A::B();
}
此外,根据[class.qual]/2,下面的代码是良好的形式,在这种情况下,所有3个编译器都会产生预期的输出(请参见此示例)。
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()
但我想知道使用声明命名构造函数的作用是什么,就像上面类A中的using B::B;
。请注意,无论B
是否为A
的基类,在这种情况下using-declaration都是完全无关紧要的。
[class.inhctor]
。 - TartanLlamaB::A()
声明了一个函数,B::A ba;
创建了一个类型为A
的自动变量ba
。 - TartanLlama这样的构造函数名称只能在命名构造函数的声明符或using-declaration中使用。
- BellocA::A()
的,它与B::A()
完全不同。前者可以在[class.qual]/2
下命名构造函数,但只能在声明符号等中使用,而后者不命名构造函数,因此该规则不适用。 - TartanLlama