sách gpt4 ai đã đi

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

In lại 作者:行者123 更新时间:2023-12-03 02:19:25 28 4
mua khóa gpt4 Nike

据我所知std::allocator::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 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)Đúng explicit适用于此类调用:a.construct(p, 5)即使构造函数是 explicit,也适用于 C++11我确信它不适用于 C++98 if Foo(int)Đúng explicit .

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

1 Câu trả lời

这是因为 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 中不是必需的,因为有一个采用 số nguyên 的匹配构造函数(正是 C++98 中用于转换的构造函数)。这也是当您添加 explicit 时代码在 C++98 中不起作用的原因 - 它无法将 10 转换为 Foo > 那么。

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

28 4 0
Bài viết được đề xuất: xml - 如何在 XMLTABLE 中使用条件语句
Bài viết được đề xuất: yii - PHPDOC @property 关联到 getter
Bài viết được đề xuất: asp.net-mvc - MailDefinition/MailMessage 和基本路径不能为空
Bài viết được đề xuất: swift : Unexpectedly found nil
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com