据我所知std::allocator<T>::construct
,在旧版本的C ++上仅需要两个参数;第一个是指向未构建的原始内存的指针,我们要在其中构造一个类型的对象,T
第二个是用于初始化该对象的元素类型的值。因此,调用了复制构造函数:
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
优化来编译该语句会导致编译器失败?谢谢。
3
简短的答案:在C ++ 11之前,还没有完善的方法。@flyx在下面提供了详细信息。请注意,不涉及复制省略(不包含值传递或值返回)。
—
丹尼尔·兰格