确定是否有任何类成员可以进行堆分配



我遇到了以下问题
如果我们有class Foo,是否有一种方法(trait/meta program/trick/…(来确定(编译时(类成员中的任何一个是否可以进行堆分配?

类似这样的东西:

class A
{
int a = 5;
std::array<int,10> arr;
...
};
class B
{
char c;
std::string s;
...
};

can_allocate<A>屈服于假
can_allocate<B>屈服于真

如果字符串超过小字符串优化边界,则std::string可能会进行分配。

有人知道这种语言功能,或者一些自定义实现吗?或者可能根本无法实现?

这不是一个完整的答案,但如果你可以使用c++20,并且你可以接受一些限制(即它只适用于文字类型(,你可能可以利用这样一个事实,即在c++20中,内存分配在constexpr上下文中是允许的,只要它们不出现在运行时代码中

class A
{
int a = 5;
std::array<int,10> arr;
};
class B
{
char c{};
std::string s{};
};
template<typename T>
consteval T check_me() {
return {};
}
int main() {
check_me<A>();
check_me<B>(); // doesn't compile
}

编译器资源管理器。

似乎msvc错误地没有拒绝编译这个,但我认为这是一个编译器错误(?(。

此外,请注意,此代码只检查默认构造函数,而不检查分配是否发生在T的任何成员函数或其成员中。

最新更新