我遇到了以下问题
如果我们有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
的任何成员函数或其成员中。