В соответствии с ответами, полученными мной here, приведенный ниже код плохо сформирован, несмотря на то, что clang
и vs2015
принимают его.Попытка понять [class.qual]/2 в стандарте C++
#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 B::B;
) в классе выше A
. Обратите внимание, что это с использованием декларации совершенно не имеет отношения к этому случаю, независимо от того, является ли B
базовым классом A
, или нет.
Ваш пример выше, кажется, чтобы подтвердить, что вы говорите. Но можете ли вы предоставить цитату из стандарта, поддерживающего эту конструкцию. Я никогда не видел эту конструкцию раньше. – Belloc
Стандартизация немного длинна для того, чтобы вставить его в мой вопрос, но вы, вероятно, захотите посмотреть на '[class.inhctor]' – TartanLlama
После быстрого изучения [class.inhctor] я должен согласиться с вами. Кажется, ответ на мой второй вопрос (+1). Но я до сих пор не уверен в моем первом вопросе. – Belloc