これはr値の実験でしたが、gccがmove-constructorの欠如について私に泣き言を言ったときに変異し(私はそれを削除しました)、コピーコンストラクターにフォールバックしませんでした(予想どおり)-std =を削除しましたフラグからc++ 11を実行し、以下に示すものを試してみました.出力がたくさんあります(最初はそうではありませんでした)。 stdout のメッセージは、何かが起こっていることを示す良い指標となります)
これが私のコードです:
#include <iostream>
class Object {
public:
Object() { id=nextId; std::cout << "Creating object: "<<id<<"\n"; nextId++; }
Object(const Object& from) {
id=nextId; std::cout << "Creating object: "<<id<<"\n"; nextId++;
std::cout<<"(Object: "<<id<<" created from Object: "<<from.id<<")\n";
}
Object& operator=(const Object& from) {
std::cout<<"Assigning to "<<id<<" from "<<from.id<<"\n";
return *this;
}
~Object() { std::cout<<"Deconstructing object: "<<id<<"\n";}
private:
static int nextId;
int id;
};
int Object::nextId = 0;
Object test();
int main(int,char**) {
Object a;
std::cout<<"A ought to exist\n";
Object b(test());
std::cout<<"B ought to exist\n";
Object c = test();
std::cout<<"C ought to exist\n";
return 0;
}
Object test() {
std::cout<<"In test\n";
Object tmp;
std::cout<<"Test's tmp ought to exist\n";
return tmp;
}
出力:
Creating object: 0
A ought to exist
In test
Creating object: 1
Test's tmp ought to exist
B ought to exist
In test
Creating object: 2
Test's tmp ought to exist
C ought to exist
Deconstructing object: 2
Deconstructing object: 1
Deconstructing object: 0
私は deconstructing を使用します。なぜなら、deconstructing はすでに単語になっているからです。時々私は destructor を使用します。私はこの単語にあまり満足していません。名詞として destructor を好みます。
これが私が期待したものです:
A to be constructed
tmp in test to be constructed, a temporary to be created from that
tmp, tmp to be destructed(?)
that temporary to be the argument to B's copy constructor
the temporary to be destructed.
C's default constructor to be used
"" with a temporary from `test`
C's assignment operator to be used
the temporary to be destructed
c,b,a to be destructed.
私は「頑固な C」と呼ばれており、C++ を「名前空間を持つ C」以上のものとして使用することを学ぼうとしています。
誰かが「コンパイラが最適化する」と言うかもしれません。そのような人には、そのような答えで質問に答えないでほしいと思います.最適化はプログラムの状態を変更してはなりません.コンパイラは、数値を含む cout にメッセージを表示することで私をからかうかもしれません。数値を増やすことさえ気にしないかもしれませんが、プログラムの出力は、コードが記述するすべてのことを実行した場合と同じになります。
これは最適化ではありません。何が起こっているのでしょうか?