gpt4 book ai didi

c++ - 旧的 allocator::construct 和新的 allocator::construct 以及显式构造函数之间有什么区别?

转载 作者:行者123 更新时间:2023-12-03 02:19:25 28 4
gpt4 key购买 nike

据我所知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)即使构造函数是 explicit,也适用于 C++11我确信它不适用于 C++98 if Foo(int)explicit .

  • 如果是这样,那么如果我使用某种禁用方式编译该语句 copy-elision优化会导致编译失败吗?谢谢。

最佳答案

这是因为 construct 的声明 changed in C++11 :

void construct( pointer p, const_reference val );  (1)  (until C++11)
template< class U, class... Args >
void construct( U* p, Args&&... args ); (2) (since C++11)

第一个声明调用复制构造函数,而第二个声明调用与给定参数列表匹配的构造函数。这可以是复制构造函数,也可以是您在代码中看到的另一个构造函数。

a.construct(p, 10) 调用 C++98 中的复制构造函数,因为 10 通过以下方式隐式转换为 Foo Foo(int) 构造函数。此转换在 C++11 中不是必需的,因为有一个采用 int 的匹配构造函数(正是 C++98 中用于转换的构造函数)。这也是当您添加 explicit 时代码在 C++98 中不起作用的原因 - 它无法将 10 转换为 Foo > 那么。

关于c++ - 旧的 allocator::construct 和新的 allocator::construct 以及显式构造函数之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58749281/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com