类,constexpr构造函数和std :: string

时间:2018-06-20 16:47:12

标签: c++ destructor allocation constexpr

我最近一直在用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 *,但是我还没有尝试过(除非必须,否则不要这么做)。如果它们确实进入堆,是否有办法将它们强制进入堆栈?

谢谢。

1 个答案:

答案 0 :(得分:4)

std::string不是数组。它在堆上分配其内容(cons SSO),因此无法在当前C ++中将其constexpr制成(工作中存在一些建议,可以实现constexpr“动态”分配)。

但是,有几种解决方法以一种或另一种方式使用编译时字符串,例如将其嵌入模板参数(Foo<'H', 'e', 'l', 'l', 'o'>)中。在大多数情况下,您也可以只使用const char *