Hãy xem xét các đoạn mã sau:chuyển đổi ngầm từ int để shared_ptr
#include <iostream>
#include <memory>
void f(std::shared_ptr<int> sp) {}
template <typename FuncType, typename PtrType>
auto call_f(FuncType f, PtrType p) -> decltype(f(p))
{
return f(p);
}
int main()
{
f(0); // doesn't work for any other int != 0, thanks @Rupesh
// call_f(f, 0); // error, cannot convert int to shared_ptr
}
Trong dòng đầu tiên trong main()
, số nguyên 0
được chuyển thành một std::shared_ptr<int>
và cuộc gọi f(0)
thành công mà không cần bất kỳ vấn đề. Tuy nhiên, bằng cách sử dụng một mẫu để gọi chức năng làm cho mọi thứ khác nhau. Dòng thứ hai sẽ không biên dịch nữa, lỗi là
error: could not convert 'p' from 'int' to 'std::shared_ptr<int>'
Câu hỏi của tôi là:
- Tại sao cuộc gọi đầu tiên thành công và lần thứ hai không? Có điều gì tôi thiếu ở đây không?
- Tôi cũng không hiểu cách chuyển đổi từ
int
sangstd::shared_ptr
đang được thực hiện trong cuộc gọif(0)
, vì có vẻ nhưstd::shared_ptr
chỉ có các nhà thầu rõ ràng.
PS: Một biến thể của ví dụ này xuất hiện trong Scott Meyers' hiệu quả Modern C++ khoản 8, như một cách để bảo vệ cuộc gọi như vậy với nullptr
.
@@ vsoftco bạn nên đề cập đến rằng nó đang làm việc chỉ cho 'f (0)', ngoài việc không có gì được biên soạn, cùng lỗi cho khác giá trị ngay cả trong cuộc gọi đầu tiên. –
[This] (http://en.cppreference.com/w/cpp/language/nullptr) gợi ý giải thích - "Có tồn tại chuyển đổi ngầm định từ nullptr thành giá trị con trỏ null của bất kỳ loại con trỏ nào và bất kỳ con trỏ nào thành loại thành viên. Chuyển đổi tương tự tồn tại cho bất kỳ giá trị nào của loại std :: nullptr_t cũng như cho macro NULL, hằng số con trỏ null. " Nhưng nó sẽ là thú vị để xem nó giải thích với các tài liệu tham khảo tiêu chuẩn và rõ ràng hơn. – Pradhan
@RupeshYadav. làm xong. Thật vậy, nó là rất lạ, có vẻ như một số loại chuyển đổi con trỏ tiềm ẩn đang được thực hiện. – vsoftco