От моя прочит на отговорите на 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.
РЕДАКТИРАНЕ: Освен това, както е обяснено в този отговор, идеалният идиом за пренасочване не е заместител на наследяващите конструктори. И така, как точно изглежда тялото?