В функцию constexpr попадает точка останова - PullRequest
3 голосов
/ 03 мая 2019

Вот мой код:

#include <string.h>
#include <stdlib.h>


template <int ...I>
class MetaString
{
    char buffer_[sizeof...(I)+1];
public:
    // A constexpr constructor 
    constexpr MetaString(const char * arg) :buffer_{ encrypt(arg[I])... }
    {}
    constexpr const char *get()const { return buffer_; }
private:

    constexpr char encrypt(const char c) const { return c ^ 0x55; }
};

char *decrypt(const char* buffer_, int size)
{
    char* tmp = (char *)malloc(size + 1);

    strcpy_s(tmp, size + 10, buffer_);

    for (int i = 0; i < size; i++)
    {
        *(tmp + i) = *(tmp + i) ^ 0x55;
    }

    return tmp;
}

int main()
{
    constexpr MetaString<0,1,2,3,5> var("Post Malone");

    char * var1 = decrypt(var.get(), 5);
    std::cout <<  var1 << std::endl;

    return 1;
}

Идея проста, я создаю объект MetaString и предоставляю ему string. Конструктор шифрует аргумент XOR. Тогда у меня есть decrypt функция, которая расшифровывает значение обратно.

Проблема в том, что я устанавливаю точку останова в конструкторе (в частности, в этой строке constexpr MetaString(const char * arg) :buffer_{ encrypt(arg[I])... }), и она срабатывает, когда я запускаю в режиме отладки. Что, как я понимаю, означает, что конструктор вызывается во время выполнения.

Чтобы гарантировать, что функции будут оцениваться во время компиляции, я создал объект таким образом constexpr MetaString<0,1,2,3,5> var("Post Malone"); Но я читал, что переменная constexpr должна быть литерального типа.

Итак, мой вопрос: как мне получить переменную типа var (в которой были бы зашифрованные данные и которая была бы оценена во время компиляции), а затем вызвать decrypt во время выполнения и получить исходное значение?

1 Ответ

3 голосов
/ 03 мая 2019

constexpr только гарантирует, что функция или переменная может использоваться в постоянном выражении.Это не гарантирует, что функция / объект всегда будет оцениваться / создаваться во время компиляции.В вашем конкретном случае это на самом деле невозможно, поскольку мы говорим об объекте с автоматическим хранением.Объект, если он будет создан, действительно может быть создан только во время работы программы.Попробуйте сделать вашу переменную static

...