繁体   English   中英

函数指针与作为模板非类型参数的指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM