Một con trỏ hàm của loại bool (*)()
có thể được chuyển đổi thành std::function<bool()>
nhưng không phải là cùng loại, do đó cần chuyển đổi. Trước khi trình biên dịch có thể kiểm tra xem chuyển đổi đó có thể cần phải suy ra ReturnT
là bool
, nhưng để làm điều đó, cần phải biết rằng std::function<bool()>
là một chuyển đổi có thể, điều này là không thể cho đến khi nó suy ra ReturnT
... xem sự cố?
Ngoài ra, hãy xem xét rằng bool(*)()
cũng có thể được chuyển đổi thành std::function<void()>
hoặc std::function<int()>
... cần được suy luận?
xem xét đơn giản hóa này:
template<typename T>
struct function
{
template<typename U>
function(U) { }
};
template<typename T>
void foo(function<T>)
{ }
int main()
{
foo(1);
}
Làm thế nào trình biên dịch có thể biết liệu bạn muốn tạo ra function<int>
hoặc function<char>
hoặc function<void>
khi họ có thể tất cả được xây dựng dưới hình thức một int
?
Nguồn
2012-06-19 15:03:34
Câu trả lời cho [một trong các câu hỏi trước của tôi] (http://stackoverflow.com/questions/9625526/check-at-compile-time-if-template-argument-is-void) cho phép loại cú pháp này. Tôi hy vọng rằng sẽ giúp. Đó là trường hợp đặc biệt trong trường hợp loại trả về cũng bị vô hiệu. – chris
@chris Cảm ơn gợi ý - Tôi sẽ cố gắng hiểu nó :) –
N.B. rất giống với http://stackoverflow.com/q/7608741/981959 và http://stackoverflow.com/q/9242234/981959, nhưng tôi nghĩ câu trả lời ở đây rõ ràng hơn cho câu hỏi cụ thể này. –