在常量表达式中分配常量变量

时间:2015-09-03 16:00:44

标签: c++ const constexpr

我对此的了解有限,情况如下:

const std::map<char*, int> map;

constexpr void Foo()
{
    map["foo"] = 0;
}

这不会编译,因为它抱怨我无法为常量变量赋值。但我的印象是,如果函数在编译时被整理出来,可以设置一个常量值的值。

这样的事情可能吗?

1 个答案:

答案 0 :(得分:1)

在编译时初始化结构的唯一方法是它是否有constexpr构造函数。 std::map没有constexpr构造函数。此外,我不认为它可能有一个,因为它是部分堆分配的,newmalloc等不是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函数中进行排序可能/更容易,我不确定。