给常量表达式中的常量变量赋值

Assigning to a constant variable in an constant expression

本文关键字:常量 变量 赋值 表达式      更新时间:2023-10-16

我在这方面的知识有限,情况如下:

const std::map<char*, int> map;
constexpr void Foo()
{
    map["foo"] = 0;
}

这不能编译,因为它抱怨我不能给常量变量赋值。但我的印象是,如果在编译时对函数进行排序,可以设置一个常数值的值。

这种事可能吗?

在编译时初始化结构的唯一方法是它具有constexpr构造函数。std::map没有constexpr构造函数。我也不认为它可以有一个,因为它是部分堆分配的,new, malloc等不是constexpr

(c++ 11) 你可以像这样做:
struct my_pair {
    const char * first;
    int second;
};
constexpr my_pair my_map[] = {  {"foo", 5},
                {"bar", 10},
                {"baz", 20} };
int main() {}

当你的程序从这个数组启动时,你可以构建一个std::map

如果你真的希望数组在编译时按键排序,在c++ 11标准中,我想我会尝试使用模板元编程来实现排序。你可以使用模板/可变包扩展毫无困难地做到这一点,但可能需要一两个小时才能将其全部写出来并使其工作,这取决于你对模板的熟练程度。然后,您必须将键、值对格式化为代码中的模板参数,而不是数组元素,因此它会变得有点混乱。

在c++ 14中,可能更容易在constexpr函数中进行排序,我不确定。