可以将值分配给模板非类型参数吗?
例如
template<int N>
void foo(){
N = 4;
}
尝试将其编译为:
error: lvalue required as left operand of assignment
N = 4;
^
模板参数是哪种类型的值(值类别),我可以在函数体中“使用它们”多少? (即,读取它们,写入它们,将它们转发到其他模板参数,打印它们等等)。
例如,创建一个“注册”一个数字(在编译时作为模板参数传递)然后在每次调用该数字(在运行时)时打印该功能的函数模板的正确方法是什么?
答案 0 :(得分:2)
它们近似等于具有给定值的文字。在C ++ 20中,有一个LiteralType
概念,这是成为非类型模板参数的要求。
在类模板主体中的表达式中使用非类型模板参数的名称时,除非它的类型是左值引用类型,否则它是不可修改的prvalue
非类型非参考模板参数是prvalue。不得将其赋值或以任何其他方式更改其值。非类型非引用模板参数不能获取其地址。当将非类型的非引用模板参数用作引用的初始化程序时,总是使用临时的。