Рассмотрите приведенный ниже код C++ 11. Если я правильно понимаю семантику перемещения, конструктор копирования не следует вызывать. Но это. Может кто-нибудь объяснить, почему?C++ 11: Почему здесь вызывается копия ctor?
template<class D>
struct traced
{
public:
traced() = default;
traced(traced const&) { std::cout << typeid(D).name() << " copy ctor\n"; }
protected:
~traced() = default;
};
class A : public traced<A>{
public:
A(int x) : x_(x) {}
private:
int x_;
};
int main() {
// I thought the following two are equivalent. Apparently not.
aList.push_back(A(6)); // Prints out ".. copy ctor" ..
aList.emplace_back(6); // Does not print out " ... copy ctor"
}
Вы явно объявили копию ctor для 'traced', поэтому у нее нет движка ctor. –
Ну, почему это работает в случае emplace_back? Не следует ли вызывать копию трассировки ctor даже в этом случае? – user855
emplace_back использует конструктор по умолчанию. Он не копирует, это точка emplace_back. –