Из моего чтения ответов на SO и ссылка cppreference
Унаследованные конструкторы эквивалентны определяемым пользователем конструкторам с пустым телом и списком инициализаторов членов, состоящим из одного описателя вложенного имени, который перенаправляет все свои аргументы в конструктор базового класса.
Я пришел к выводу, что приведенные ниже классы D
и E
должны вести себя одинаково.
#include <string>
#include <utility>
using namespace std;
class B
{
public:
B(string&& a) : a(move(a))
{
}
string a;
};
class D : public B
{
public:
using B::B;
};
class E : public B
{
public:
E(string&& a) : B(a)
{
}
};
string foo()
{
return "bar";
}
int main()
{
D d = foo();//This compiles
E e = foo();//This does not compile
return 0;
}
E e = foo()
правильно не компилируется, так как конструктор B
принимает только string&&
. Однако D d = foo()
проходит нормально. Почему это? Используемый компилятор clang3.5.
РЕДАКТИРОВАТЬ: Кроме того, как объясняется в этом ответе, идеальная идиома пересылки не является заменой наследующим конструкторам. Итак, как именно выглядит тело?