C++ 模板参数是什么类型的值?我能(不)用它们做什么?

C++ 模板参数是什么类型的值?我能(不)用它们做什么?,c++,templates,value-categories,C++,Templates,Value Categories,是否可以将值指定给模板非类型参数 比如说 模板 void foo(){ N=4; } 尝试编译此文件时,我得到: 错误:赋值的左操作数需要左值 N=4; ^ 模板参数是什么类型的值(值类别),我可以在函数体中“使用它们”多少?(即读取、写入、转发到其他模板参数、打印等) 例如,创建“注册”一个数字(在编译时作为模板参数传递)并在每次调用时(在运行时)打印该数字的函数模板的正确方法是什么?它们大致相当于具有给定值的文字。在C++20中有一个概念,这是作为非类型模板参数的要求 从 当在类模板主体

是否可以将值指定给模板非类型参数

比如说

模板
void foo(){
N=4;
}
尝试编译此文件时,我得到:

错误:赋值的左操作数需要左值
N=4;
^
模板参数是什么类型的值(值类别),我可以在函数体中“使用它们”多少?(即读取、写入、转发到其他模板参数、打印等)


例如,创建“注册”一个数字(在编译时作为模板参数传递)并在每次调用时(在运行时)打印该数字的函数模板的正确方法是什么?

它们大致相当于具有给定值的文字。在C++20中有一个概念,这是作为非类型模板参数的要求

当在类模板主体内的表达式中使用非类型模板参数的名称时,除非其类型是左值引用类型,否则它是不可修改的prvalue

非类型非引用模板参数是prvalue。不得将其赋值或以任何其他方式更改其值。非类型非引用模板参数的地址不能为空。当非类型非引用模板参数用作引用的初始值设定项时,始终使用临时参数


它们近似等于具有给定值的文字。在C++20中有一个概念,这是作为非类型模板参数的要求

当在类模板主体内的表达式中使用非类型模板参数的名称时,除非其类型是左值引用类型,否则它是不可修改的prvalue

非类型非引用模板参数是prvalue。不得将其赋值或以任何其他方式更改其值。非类型非引用模板参数的地址不能为空。当非类型非引用模板参数用作引用的初始值设定项时,始终使用临时参数


你必须知道,模板只是一个替代品。在非类型模板的情况下(或此处的值模板),编译器将使用一些int值(比如
5
)替换
N
,并生成一个函数。因此,您不能将任何值赋给
5
。您必须知道,模板只是要替换的。在非类型模板的情况下(或此处的值模板),编译器将使用一些int值(比如
5
)替换
N
,并生成一个函数。因此,您不能将任何值赋给
5