代码之家  ›  专栏  ›  技术社区  ›  Arun

为什么模板声明中的size\t参数必须是const?

  •  1
  • Arun  · 技术社区  · 16 年前

    我可以

    std::bitset< 10 > bitsetA;
    

    const size_t LengthB = 20;
    std::bitset< LengthB > bitsetB;
    

    没有任何问题。

    但是,如果长度不是 const

    size_t LengthC = 30;
    std::bitset< LengthC > bitsetC;  // Line 30, say
    

    'LengthC' cannot appear in a constant-expression
    template argument 1 is invalid
    

    原因是什么?

    4 回复  |  直到 16 年前
        1
  •  4
  •   Kristopher Johnson    16 年前

    const 以便在编译时实例化模板。

    LengthC 它不会从初始化到必须实例化模板,因此可以将其视为常量,但编译器没有义务去解决这个问题。规范说必须声明参数 常数 ,这样就不需要进行编译时流控制分析。

        2
  •  6
  •   GManNickG    16 年前

    模板根据模板参数实例化新类型,这是在编译时完成的。不能在运行时实例化新类型,因为C++是静态类型的。

    因此,当您有一个non-const变量时,它不能作为模板参数传递,因为不能保证它是该值(您必须潜在地“在运行时实例化一个新类型”)。只有当它是const时,才能确保该值确实是常量,因此可以在模板参数中使用。

        3
  •  1
  •   anon anon    16 年前

        4
  •  1
  •   Xavier Ho    16 年前

    C++编译器是 严格的 const 铸造。

    10 const size_t LengthB = 20; 关键字,编译器无法轻松确定变量是否可以在声明和用法之间更改。