Tôi có ví dụ sau:Sử dụng t (* this) kết quả RuntimeError, trong khi t (std :: ref (* this) không
#include <iostream>
#include <functional>
struct Tmr {
typedef std::function<void(void)> Callback;
Callback cb;
Tmr(Callback cb_) :
cb(cb_)
{
}
void timeout()
{
cb();
}
};
struct Obj {
struct Tmr t;
Obj() :
t(std::ref(*this))
{
}
void operator()()
{
std::cout << __func__ << '\n';
}
};
int main(int argc, char *argv[])
{
Obj o;
o.t.timeout();
return 0;
}
này chạy tốt, nhưng ban đầu tôi đã có nhà xây dựng của Obj
như:.
Obj() :
t(*this)
những kết quả trong một lỗi runtime tôi đoán đây là bởi vì chỉ có một tham chiếu đến hàm thành viên được lưu trữ trong callback của tôi, và không phải là đối tượng để gọi các thành viên trên
những gì tôi. không hiểu là những gì std::ref
làm khi tôi làm Obj() : t(std::ref(*this))
và lý do tại sao điều này làm cho chương trình hoạt động. Bất cứ ai có thể làm sáng tỏ những gì đang xảy ra và nó hoạt động như thế nào?
Không có 'Obj(): t (* this)' hoạt động tốt. 'Callback' của bạn là một loại functor, mà' Obj' của bạn cũng là. –
@ Jean-BaptisteYunès Bạn đang nói trình biên dịch tạo mã không hợp lệ, vì 'Obj(): t (* this)' bị treo trong thời gian chạy, nhưng nó sẽ hoạt động tốt? – binary01
Nó hoạt động trên trình biên dịch g ++ std C++ 11 của tôi, và tôi không thể thấy tại sao nó không hoạt động cho bạn. –