私が知っているようにstd::allocator<T>::construct
、C ++の古いバージョンでは2つのパラメーターしか使用しません。T
1つ目は、型のオブジェクトを構築する生の未構築メモリへのポインタで、2つ目は、そのオブジェクトを初期化するための要素型の値です。したがって、コピーコンストラクタが呼び出されます。
struct Foo {
Foo(int, int) { cout << "Foo(int, int)" << endl; }
/*explicit*/ Foo(int) { cout << "Foo(int)" << endl; }
Foo(const Foo&) { cout << "Foo(const Foo&)" << endl; }
};
int main(int argc, char* argv[]) {
allocator<Foo> a;
Foo* const p = a.allocate(200, NULL); // second parameter is required on C++98 but on C++11 it is optional
// Foo* const p = a.allocate(200); // works fine on C++11 but not on C++98
a.construct(p, 5, 7); // works on C++ 11 and up but not C++98
a.construct(p, 10);// works on both
a.destroy(p);
a.destroy(p + 1);
a.deallocate(p, 200);
std::cout << std::endl;
}
C ++ 98では
a.construct(p, 10)
コピーコンストラクターを呼び出すのに、C ++ 11以降では整数を受け取るコンストラクターだけを呼び出すのはなぜですか?これはコンストラクタがあっても理由はいくつかのコピーエリジオンの最適化のC ++ 11の上に意味が
Foo(int)
あるexplicit
ように、コールの作品:a.construct(p, 5)
でも、コンストラクタC ++ 11の作品がありexplicit
、私は確信している場合、それはC ++ 98上で動作しませんですのよ何Foo(int)
ですexplicit
。もしそうなら、そのステートメントを何らかの
copy-elision
最適化を無効にしてコンパイルすると、コンパイラは失敗しますか?ありがとうございました。