gpt4 book ai didi

c++ - 为什么在 consteval 构造函数的编译时不知道 "this"?

转载 作者:行者123 更新时间:2023-12-01 14:20:15 29 4
gpt4 key购买 nike

我正在编写一个类来包装与设备一起使用的基于 C 的库的一部分,其中每个设备都配置有回调函数指针来处理数据。将为每个设备创建一个 MyClass 实例。见下文:

struct DeviceConfig {
void (*callback)(char *data);
};

class MyClass {
private:
DeviceConfig config;

public:
void myCallback(char *data);

MyClass() {
// Would like to set config.callback so that a call to it will result in a call of this->myCallback(data).
}
};

由于无法将捕获的 lambda 转换为函数指针,我尝试了以下解决方法:

template<MyClass *MC>
auto binder() {
return [](char *data) { MC->myCallback(data); };
}

MyClass::MyClass() {
config.callback = binder<this>();
}

但是,编译器(最新的 GCC)不喜欢在构造函数中使用 binder,因为 this 在编译时不一定是已知的,尽管我知道 MyClass 的实例只会在编译时声明。

C++20 引入了 consteval 函数(和构造函数)"must produce a compile-time constant." .但是,将 consteval 添加到构造函数和/或 binder 不会影响编译器的输出。 constexpr 也不会改变任何东西。

如果一个对象可以在编译时初始化,为什么对象的 this 也不能在编译时知道?以上是否可以通过其他方式实现?

最佳答案

构造函数是函数,就像其他函数一样。与其他函数相比,它们几乎没有什么特权,它们参数的常量表达式行为也不在其中。

this 本质上是所有非静态成员函数的参数。参数是 never常量 expressions .因此,this 不能用在需要常量表达式的上下文中。如何创建类实例并不重要。你怎么调用它并不重要。 constexpr/consteval 函数的参数永远不是常量表达式,包括 this

关于c++ - 为什么在 consteval 构造函数的编译时不知道 "this"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62185058/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com