常量表达式中不能使用非文本类型(C++)

cpjpxq1n  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(131)

下面是类的定义。

Class Type {
  public: 
    constexpr Type (std::string label, const std::set<int>& ids) : label_(label), ids_(ids) {}

  private:
    const std::string label_;
    const std::set<int>& ids_;
}

我想定义一些常量对象,这样我们就可以用它们作为枚举。例如:

const Type A = {"type_a", {1, 2}};
const Type B = {"type_b", {3}};

但我得到了以下错误

Non-literal type std::set<int> cannot be used in a constant expression

如何正确地初始化常量对象呢?也欢迎修改类定义的建议。谢谢!

hsgswve4

hsgswve41#

如果您只需要创建一个const对象,如下所示

const Type A = {"type_a", {1, 2}};

也就是说,一个对象一旦初始化就不能改变,那么你只需要从构造函数中移除constexpr

nqwrtyyt

nqwrtyyt2#

因为你不能在编译时创建字符串,首先考虑一下,字符串在大多数时候分配内存。那么你在编译时如何分配内存呢?你必须提供一些编译时分配,比如C++20中的pmr。顺便说一下,一些容器,比如std::array(看一下这个https://en.cppreference.com/w/cpp/header/array)可以用在编译时上下文中,因为它们足够简单,可以在编译时构造。记住,在编译时分配的内存必须在编译结束时释放。
而且我认为这个问题可能会帮助你更好地理解我们在这里讨论的内容。https://codereview.stackexchange.com/questions/272265/c20-compile-time-string-utility

相关问题