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
}