在 constexpr 函数断点被击中
In constexpr function breakpoint is hit
这是我的代码:
#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
这样的变量(其中包含加密数据并在编译时进行评估)然后在 [=30= 处调用 decrypt
]时间并得到原始值?
constexpr
仅保证函数或变量 可以 用于常量表达式。它不保证 function/object 在编译时总是 evaluated/constructed。在您的特定情况下,这实际上是不可能的,因为我们正在谈论一个具有自动存储持续时间的对象。对象,如果要创建,只有在程序运行时才能真正创建。尝试让你的变量 static
…
这是我的代码:
#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
这样的变量(其中包含加密数据并在编译时进行评估)然后在 [=30= 处调用 decrypt
]时间并得到原始值?
constexpr
仅保证函数或变量 可以 用于常量表达式。它不保证 function/object 在编译时总是 evaluated/constructed。在您的特定情况下,这实际上是不可能的,因为我们正在谈论一个具有自动存储持续时间的对象。对象,如果要创建,只有在程序运行时才能真正创建。尝试让你的变量 static
…