- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
据我所知std::allocator
在旧版本的 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/
Hàm sscanf() trong ngôn ngữ C: đọc tệp tiêu đề dữ liệu theo định dạng được chỉ định từ một chuỗi: ?
Gần đây, tôi gặp phải vấn đề với việc đánh giá trước công việc mà tôi không biết cách giải quyết ngay cả sau khi đã tìm hiểu cách thức hoạt động của từng chức năng. Sau đây là một mã giả. Dưới đây là một hàm có tên là foo() sẽ được truyền một giá trị và trả về một giá trị. Nếu bạn truyền giá trị sau vào hàm foo,
Hàm CStr trả về một biểu thức đã được chuyển đổi thành Biến thể có kiểu con là Chuỗi. CStr(biểu thức) Tham số biểu thức là bất kỳ biểu thức hợp lệ nào. Mô tả Thông thường, bạn có thể
Hàm CSng trả về một biểu thức đã được chuyển đổi thành Biến thể có kiểu con là Đơn. CSng(biểu thức) Tham số biểu thức là bất kỳ biểu thức hợp lệ nào. Mô tả Thông thường,
Hàm CreateObject tạo và trả về tham chiếu đến đối tượng Automation. CreateObject(servername.typename [, location]) Tham số serv
Hàm Cos trả về cosin của một góc. Cos(số) Đối số số có thể là bất kỳ biểu thức số hợp lệ nào thể hiện góc tính bằng radian. Mô tả Hàm Cos lấy một góc và trả về tỷ số giữa hai cạnh của một tam giác vuông. Tỷ lệ này là
Hàm CLng trả về một biểu thức đã được chuyển đổi thành Biến thể có kiểu con Long. CLng(biểu thức) Tham số biểu thức là bất kỳ biểu thức hợp lệ nào. Mô tả Thông thường, bạn có thể sử dụng
Hàm CInt trả về một biểu thức đã được chuyển đổi thành Biến thể có kiểu con là Số nguyên. CInt(biểu thức) Tham số biểu thức là bất kỳ biểu thức hợp lệ nào. Mô tả Thông thường,
Hàm Chr trả về ký tự tương ứng với mã ký tự ANSI đã chỉ định. Chr(charcode) Tham số charcode là một số xác định một ký tự. Mô tả Các số từ 0 đến 31 biểu thị tiêu chuẩn không in được
Hàm CDbl trả về một biểu thức đã được chuyển đổi thành Biến thể có kiểu con là Double. CDbl(biểu thức) Tham số biểu thức là bất kỳ biểu thức hợp lệ nào. Mô tả Thông thường, bạn có thể
Hàm CDate trả về một biểu thức đã được chuyển đổi thành Biến thể của kiểu con Date. CDate(date) Tham số ngày là bất kỳ biểu thức ngày hợp lệ nào. Mô tả Hàm IsDate được sử dụng để xác định d
Hàm CCur trả về một biểu thức đã được chuyển đổi thành Biến thể có kiểu con là Currency. CCur(biểu thức) Tham số biểu thức là bất kỳ biểu thức hợp lệ nào. Mô tả Thông thường,
Hàm CByte trả về một biểu thức đã được chuyển đổi thành Biến thể có kiểu con là Byte. CByte(biểu thức) Tham số biểu thức là bất kỳ biểu thức hợp lệ nào. Mô tả Thông thường, bạn có thể
Hàm CBool trả về một biểu thức được chuyển đổi thành một Biến thể có kiểu con Boolean. CBool(expression) expression là bất kỳ biểu thức hợp lệ nào. Nếu cũ
Hàm Atn trả về cung tan của một số. Atn(số) Tham số số có thể là bất kỳ biểu thức số hợp lệ nào. Mô tả Hàm Atn tính tỉ số hai cạnh của một tam giác vuông (số) và trả về cung của góc tương ứng.
Hàm Asc trả về mã ký tự ANSI tương ứng với chữ cái đầu tiên của chuỗi. Asc(chuỗi) Tham số chuỗi là bất kỳ biểu thức chuỗi hợp lệ nào. Nếu đối số chuỗi không chứa ký tự, lỗi thời gian chạy sẽ xảy ra.
Hàm Array trả về một Biến thể chứa một mảng. Mảng(arglist) Đối số arglist là danh sách các giá trị được phân tách bằng dấu phẩy để gán cho các phần tử của mảng có trong Biến thể. Nếu tham số này không được chỉ định,
Hàm Abs trả về giá trị tuyệt đối của một số. Abs(số) Tham số số có thể là bất kỳ biểu thức số hợp lệ nào. Nếu number chứa Null, nó sẽ trả về Null; nếu đó là biến chưa được khởi tạo, nó sẽ trả về 0.
Hàm FormatPercent trả về một biểu thức được định dạng dưới dạng phần trăm (nhân với 100) với dấu % theo sau. Định dạngPhần trăm(biểu thức[,NumDigitsAfterD
Hàm FormatNumber trả về một biểu thức được định dạng dưới dạng số. Định dạngSố(biểu thức [,NumDigitsAfterDecimal [,Inc
Tôi là một lập trình viên xuất sắc, rất giỏi!