首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定任何类成员是否可以进行堆分配?

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

Stack Overflow用户
提问于 2022-10-04 09:57:48
回答 1查看 92关注 0票数 2

我遇到了以下问题。

如果我们有class Foo,有没有一种方法(特性/元程序/戏法/.)要确定(编译时间)是否有任何类成员可以进行堆分配?

就像这样:

代码语言:javascript
复制
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可能会分配。

是否有人知道这种语言特性,或某些自定义实现?或者这甚至是无法实现的?

EN

回答 1

Stack Overflow用户

发布于 2022-10-04 11:04:11

这不是一个完整的答案,但是如果您可以使用c++20,并且您可以忍受一些限制(也就是说,它只适用于文字类型),那么您可能可以利用以下事实:在c++20中,只要不将内存分配放入运行时代码中,就允许在constexpr上下文中分配内存。因此,也许您可以在以下内容的基础上进行构建:

代码语言:javascript
复制
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的任何成员函数或其成员中是否会发生分配。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73946173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档