Рассмотрим следующий код С++:
#include <string>
struct A {
A(const std::string& s): s(s) {}
std::string s;
};
struct B: A {
using A::A;
};
int main() {
B b("test");
}
Когда я скомпилирую его через GCC 6.2.1 с параметром -Wuseless-cast
g++ -std=c++14 -Wuseless-cast test.cpp -o test
он выдает следующее предупреждение:
test.cpp: In constructor ‘B::B(const string&)’:
test.cpp:9:14: warning: useless cast to type ‘const string& {aka const std::__cxx11::basic_string<char>&}’ [-Wuseless-cast]
using A::A;
^
test.cpp: In function ‘int main()’:
test.cpp:13:15: note: synthesized method ‘B::B(const string&)’ first required here
B b("test");
^
Однако, когда я изменяю определение B
на
struct B: A {
B(const std::string& s): A(s) {}
};
предупреждение уходит.
Вопросы:
- Почему выдается предупреждение?
- Почему указание конструктора для
B
вместо наследования его изA
устраняет предупреждение?