[英]Pointer to function vs function as template non-type parameter
我试图了解以下代码段中发生的情况:
// using FUN = void(*)(void);
using FUN = void(void);
template<FUN fun> struct Fun{};
int main ()
{
FUN fun;
Fun<fun>{};
}
我可以将void(void)
用作函数非类型参数,一切都很好,程序可以编译。 但是,将类型更改为函数指针,即删除第一行中的注释并注释第二行,将导致错误
( g ++ )错误:“ fun”的值在常量表达式中不可用
( clang )错误:类型为'FUN'的非类型模板参数(aka'void(*)()')不是常量表达式
到底是怎么回事? 函数类型实际上与指向函数的指针不一样吗(即,在任何地方都可以隐式转换吗?)我知道指向函数的指针不应该起作用,因为这FUN fun;
main
它不是一个常量表达式,但是为什么将FUN
声明为void(void);
让它起作用?
类型“阵列的非类型模板参数
T
”或“函数返回T
”被调整为类型“指针的T
”或“指针函数返回T
分别”,。
(在C ++ 14中为[temp.param] / 8)
因此,模板Fun
是相同的模板,而不管FUN
是声明为函数还是指向函数类型的指针。
但是,此块声明:
FUN fun;
根据FUN
是什么,其含义有所不同。 如果FUN
是一个函数,则这是一个函数的块声明(如果使用odr,则必须在其他地方定义)。 通常,您可以将函数的名称用作函数类型的指针的模板参数的参数-此处没有问题。 但是,如果FUN
是函数指针,则会创建一个未初始化的函数指针。 由于它是一个非const
对象,因此不能用作模板参数,就像int
变量不能用作int
模板参数的模板参数一样,而const int
变量也可以。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.