Подтвердить что ты не робот

Почему GCC предупреждает меня о бесполезном использовании при использовании унаследованного конструктора?

Рассмотрим следующий код С++:

#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 устраняет предупреждение?
4b9b3361

Ответ 1

Ваш пример может быть дополнительно уменьшен до:

struct A {
    A(const int& i): i(i) {}
    int i;
};

struct B: A {
    using A::A;
};

int main() {
    B b(0);
}

Это открытая проблема в GCC.
Включение <string>, по-видимому, не требуется для его воспроизведения. Обратите внимание, что проблема по-прежнему неподтверждена, и, как известно, она затрагивает, по крайней мере, GCC 6.1 - посмотрев на ваш вопрос, я бы сказал, что он также влияет на GCC 6.2.

Ответ 2

Вероятно, вы столкнулись с известной ошибкой GCC (PR 70844).