我最近一直在用constexpr代替枚举,但是我遇到了字符串问题(表面上)。
这是我的代码:
namespace Constant {
namespace Implementation {
using std::array;
using std::string;
using type = uint8_t;
namespace Items::Compile_Time {
template<class element, type size>
struct Ray {
const array<element, size> constants {};
constexpr explicit Ray(const array<element, size> constants_in) : constants(constants_in) {}
element constexpr operator[](const type index) const {
return this->constants[index];
}
};
static constexpr type
methods = 0,
signals = 1;
// Plan on cleaning this up later.
constexpr auto BooleanIndicator = Ray<Ray<int, 1>, 2>(array<Ray<int, 1>, 2> {Ray<int, 1> {array<int, 1> {0}}, Ray<int, 1> {array<int, 1> {1}}});
}
}
using namespace Implementation::Items;
}
这很好。但是,如果我将'int'模板参数替换为'string'并将字符串放入它们各自的位置(替换最嵌套的0和1),则对于具有非平凡析构函数的实例化,我会收到错误消息。
这是为什么?我假设所有数组,包括字符串,都是微不足道的。他们分配在堆上吗?我正在猜测是否可以使用const char *,但是我还没有尝试过(除非必须,否则不要这么做)。如果它们确实进入堆,是否有办法将它们强制进入堆栈?
谢谢。
答案 0 :(得分:4)
std::string
不是数组。它在堆上分配其内容(cons SSO),因此无法在当前C ++中将其constexpr
制成(工作中存在一些建议,可以实现constexpr
“动态”分配)。
但是,有几种解决方法以一种或另一种方式使用编译时字符串,例如将其嵌入模板参数(Foo<'H', 'e', 'l', 'l', 'o'>
)中。在大多数情况下,您也可以只使用const char *