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