C++ 试图理解C++;标准

C++ 试图理解C++;标准,c++,constructor,language-lawyer,c++14,C++,Constructor,Language Lawyer,C++14,根据我获得的答案,尽管clang和vs2015接受它,但下面的代码格式不正确 #include <iostream> class A { public: A() { std::cout << "A()" << '\n'; } }; int main() { A::A(); } 但是我想知道,像上面类a中的那样(使用B::B;),使用命名构造函数的using声明有什么用处。注意,在这种情况下,无论B是否是a的基类,这个使用声明都是完全无关的 我认

根据我获得的答案,尽管
clang
vs2015
接受它,但下面的代码格式不正确

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

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

但是我想知道,像上面类
a
中的那样(
使用B::B;
),使用命名构造函数的using声明有什么用处。注意,在这种情况下,无论
B
是否是
a
的基类,这个使用声明都是完全无关的

我认为您的第二个样本的格式很好。
[class.qual]/2
中的规则规定,如果在
C
中查找时在嵌套名称说明符之后指定的名称是
C
的注入类名,则该名称引用构造函数。在
A::B
的情况下,嵌套名称说明符后指定的名称是
B
的注入类名(由于继承而可见),而不是
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
}

struct B{B(int a){std::cout您上面的示例似乎证实了您的说法。但是您能否提供一个支持此结构的标准的引用。我以前从未见过此结构。在我的问题中,standardese有点长,但您可能想看看
[class.inhctor]
在快速查看[class.inhctor]之后,我不得不同意你的看法。它似乎回答了我的第二个问题(+1)。但我仍然不相信我的第一个问题。在[class.qual]中的示例中/2关于我的第一个问题,声明
B::A ba;//类型A的对象似乎与你上面所说的相矛盾。@Belloc它与什么相矛盾?
B::A();
声明了一个函数,
B::A ba;
创建了一个类型为
A
的名为
ba
的自动变量。
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()
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
}