从 class 的构造函数中引用这个指针并连接一个 lambda 是否合法?
Is it legal to refer to this pointer and hook up a lambda from inside the constructor of a class?
场景:
我有如下所示的 class,它在构造函数本身中连接了一个 lambda。而 lambda 依次调用一个 class 成员函数。
代码:
class SomeClass {
public:
typedef std::function<void(int)> Callback;
void ListenForCallback(const Callback& callback) {
m_callback = callback;
}
private:
Callback m_callback;
}
class MyClass {
public:
MyClass() {
m_some_class = std::make_unique<SomeClass>();
// Here in constructor itself I pass this pointer and hooking up to a lambda which calls a member function. Is this legal?
m_some_class->ListenForCallback([this](int value) {
std::cout << "Value is: " << value << std::endl;
TakeAction();
})
}
private:
std::unique_ptr<SomeClass> m_some_class;
void TakeAction() {
// Please do something
}
}
问题:
我对在 MyClass
的构造函数本身中使用 this
指针持怀疑态度。甚至进一步怀疑连接一个调用成员的 lambda。但是,我发现上面的代码有效!我在上面的代码中所做的一切都是合法和正确的吗?
在 class 的构造函数中引用 this
指针是否有效?我想知道它是否 valid/invalid 以及答案背后的解释或推理。
环境:
使用 Clang 和 GCC 编译器编译的 C++ 14 代码。
这很好。 class MyClass
的对象此时存在。所以指针this
是有效的,当然classsomeClass
也已经构造完成
唯一需要注意的是 MyClass
的成员初始化顺序 - 但实际上只在初始化列表中,尽管因为您在这里没有使用初始化列表,所以这不是问题无论如何示例...
它可以出现在任何非静态成员函数的主体中。
来源:https://en.cppreference.com/w/cpp/language/this
构造函数是非静态成员函数,所以是合法的。
场景:
我有如下所示的 class,它在构造函数本身中连接了一个 lambda。而 lambda 依次调用一个 class 成员函数。
代码:
class SomeClass {
public:
typedef std::function<void(int)> Callback;
void ListenForCallback(const Callback& callback) {
m_callback = callback;
}
private:
Callback m_callback;
}
class MyClass {
public:
MyClass() {
m_some_class = std::make_unique<SomeClass>();
// Here in constructor itself I pass this pointer and hooking up to a lambda which calls a member function. Is this legal?
m_some_class->ListenForCallback([this](int value) {
std::cout << "Value is: " << value << std::endl;
TakeAction();
})
}
private:
std::unique_ptr<SomeClass> m_some_class;
void TakeAction() {
// Please do something
}
}
问题:
我对在 MyClass
的构造函数本身中使用 this
指针持怀疑态度。甚至进一步怀疑连接一个调用成员的 lambda。但是,我发现上面的代码有效!我在上面的代码中所做的一切都是合法和正确的吗?
在 class 的构造函数中引用 this
指针是否有效?我想知道它是否 valid/invalid 以及答案背后的解释或推理。
环境:
使用 Clang 和 GCC 编译器编译的 C++ 14 代码。
这很好。 class MyClass
的对象此时存在。所以指针this
是有效的,当然classsomeClass
也已经构造完成
唯一需要注意的是 MyClass
的成员初始化顺序 - 但实际上只在初始化列表中,尽管因为您在这里没有使用初始化列表,所以这不是问题无论如何示例...
它可以出现在任何非静态成员函数的主体中。
来源:https://en.cppreference.com/w/cpp/language/this
构造函数是非静态成员函数,所以是合法的。