在ConstexPR函数中,断点被击中

In constexpr function breakpoint is hit

本文关键字:断点 函数 ConstexPR      更新时间:2023-10-16

这是我的代码:

#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并获取原始值?

constexpr仅保证函数或变量可以在常数表达式中使用。它不能保证函数/对象将始终在编译时进行评估/构造。在您的特殊情况下,这实际上是不可能的,因为我们正在谈论具有自动存储持续时间的对象。如果要创建该对象,则只能在程序运行时真正创建。尝试使您的变量static&Hellip;