C++ 11을 실행하는 아래의 코드를 고려하십시오. move semantics가 올바르게 이해되면 복사 생성자를 호출하면 안됩니다. 하지만 그것은. 왜 누군가가 설명 할 수 있습니까?C++ 11 : 여기에 복사기가 호출되는 이유는 무엇입니까?
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"
}
aList.push_back(A(6));
'추적'에 대한 복사본 ctor를 명시 적으로 선언 했으므로 이동 코드가 없습니다. –
음, 그럼 왜 emplace_back의 경우에 작동합니까? 이 경우에도 추적 코드를 호출하면 안됩니까? – user855
emplace_back이 기본 생성자를 사용 중입니다. 그것은 복사하지 않습니다, 그것은 emplace_back의 포인트입니다. –