簡體   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