我遇到了以下问题。
如果我们有class Foo,有没有一种方法(特性/元程序/戏法/.)要确定(编译时间)是否有任何类成员可以进行堆分配?
就像这样:
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可能会分配。
是否有人知道这种语言特性,或某些自定义实现?或者这甚至是无法实现的?
发布于 2022-10-04 11:04:11
这不是一个完整的答案,但是如果您可以使用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的任何成员函数或其成员中是否会发生分配。
https://stackoverflow.com/questions/73946173
复制相似问题