Ho giocato con std :: vector per capire quando gli oggetti sono costruiti, destrutturati, copiati e costruiti. Per fare così, ho scritto il seguente programmaRidimensiona su std :: vector non chiama move constructor
#include <iostream>
#include <vector>
class Test {
public:
Test() {
std::cout << "Constructor called for " << this << std::endl;
}
Test(const Test& x) {
std::cout << "Copy Constructor called for " << this << std::endl;
}
Test(Test&& x) {
std::cout << "Move Constructor called for " << this << std::endl;
}
~Test() {
std::cout << "Destructor called for " << this << std::endl;
}
};
int main() {
std::vector<Test> a(1);
a.resize(3);
return 0;
}
Quando una viene ridimensionata, riallocazione accade. La mia ipotesi sarebbe che l'oggetto a [0] è stato spostato nel nuovo a [0]. Ma con libC++ e libstdC++ sembra che sia chiamato il costruttore di copie e non il costruttore di move. C'è qualche ragione per un tale comportamento?
si potrebbe pensare che l'ottimizzatore dovrebbe dedurre che il vostro costruttore non buttare e usarlo anche senza l'identificatore noexcept. – gbjbaanb
@gbjbaanb Il compilatore _ever_ dedifica i modificatori? Non per 'const' (come postfix). – ApproachingDarknessFish
@gbjbaanb Penso che tecnicamente potresti fare il lancio di 'cout' tramite [' ios :: exceptions'] (http://en.cppreference.com/w/cpp/io/basic_ios/exceptions). –