gpt4 book ai didi

c++ - 在 constexpr 函数断点被击中

转载 作者:太空狗 更新时间:2023-10-29 21:10:03 25 4
gpt4 key购买 nike

这是我的代码:

#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])... } )并且当我在 Debug模式下运行时它被命中。据我了解,这意味着构造函数在运行时被调用。

为了保证在编译时对函数进行求值,我以这种方式创建了对象 constexpr MetaString<0,1,2,3,5> var("Post Malone");但我读过 constexpr变量必须是文字类型。

所以我的问题是我怎样才能拥有像var这样的变量? (其中包含加密数据并在编译时进行评估)然后调用 decrypt在运行时获取原始值?

最佳答案

constexpr 仅保证函数或变量可以用于常量表达式。它不保证函数/对象总是在编译时被评估/构造。在您的特定情况下,这实际上是不可能的,因为我们正在谈论一个具有自动存储持续时间的对象。对象,如果要创建,只有在程序运行时才能真正创建。尝试让你的变量 static...

关于c++ - 在 constexpr 函数断点被击中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55968745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com