剖析C 中的常量表示式與省略號的相關作用

2022-09-27 10:54:11 字數 2829 閱讀 4425

c++ 常量表示式

常量值是指不會更改的值。c + + 提供了兩個關鍵字,它們使你能夠表達不打算修改物件的意圖,還可讓你實現該意圖。

c++ 需要常量表示式(計算結果為常量的表示式)以便宣告:

常量表示式中合法的唯一運算元是:

必須將非整型常量(顯式或隱式)轉換為常量表示式中合法的整型。因此,以下**是合法的:

const double size = 11.0;

char charray[(int)size];

到整型的顯式轉換在常量表示式中是合法的;所有其他型別和派生型別是非法的(在用作 sizeof 運算子的運算元時除外)。

逗號運算子和賦值運算子不能用於常量表示式。

省略號和可變引數模板

省略號在 c 和 c++ 中具有許多用途。這些包括函式的變數引數列表。c 執行庫的 printf() 函式是一種最常見的示例。

variadic 模板是支援任意數量的引數的類或函式模板。此機制對 c++ 庫開發人員尤其有用,因為您可以將其應用於類模板和函式模板,從而提供一系列型別安全和重要功能以及靈活性。

語法可變引數模板用兩種方法使用省略號。引數名稱的左側表示引數包,引數名稱的右側將引數包擴充套件為單獨的名稱。

以下是可變引數模板類定義語法的基本示例:

template class classname;

如以下示例所示,對於引數裝箱和展開,可以根據您的喜好在省略號周圍新增空白,例如:

template class classname;

或為:template class classname;

請注意本文使用的是顯示在第乙個例子中約定(該省略號附加於typename).

在前面的示例中,arguments 是引數包。類 classname 可以接受引數數目可變,例如以下示例:

template class vtclass;

vtclass< > vtinstance1;

vtclass vtinstance2;

vtclass vtinstance3;

vtclass, std::string> vtinstance4;

通過使用可變引數模板類定義,您還可以要求至少乙個引數。

template class classname;

以下是可變引數模板函式語法的基本示例:

template returntype functionname(arguments... args);

如下一節「了解可變引數模板」所示,arguments 引數包展開使用。

variadic 模板函式語法還可能有其他形式,包括不限制於:

template returntype functionname(arguments&... args);

template returntype funwww.cppcns.comctionname(arguments&&... args);

template returntype functionname(arguments*... args);

還允許使用類似 const 的說明符:

template returntype functionname(const arguments&... args);

按照可變引數模板類的定義,您可以建立需要至少乙個引數的函式:

複製** **如下:

template returntype functionname(const first& first, const rest&... args);

可變模板使用 sizeof...() 運算子(與更早的 sizeof() 運算子不相關):

template

void tfunc(const arguments&... args)

更多有關省略號位置

過去,本文介紹了定義引數裝箱和展開「在引數名稱左側的省略號位置,它表示引數,包,並在引數名稱右側,其展開引數裝箱到單獨的名稱」。這是技術上為 true,但可能會費一番功夫在轉換**。請考慮:

模板引數列表(template ), typename... 介紹了模板引數包。

在引數宣告語句(func(parameter-list)),「頂層」省略號介紹函式引數包,並且該省略號地位是很wdmxwaj重要的

// v1 is not a function parameter pack:

template void func1(std::vector v1);

// v2 is a function parameter pack:

template void func2(std::vector... v2);

如果省略號在引數名之後出現,則具有引數 pack 展開。

一種闡明 variadic 模板功能框架的好方法是在 printf 一些功能的重新寫入中使用:

#include

using namespace std;

void print()

template void print(const t& t)

template void print(const first& first, const rest程式設計客棧&... rest)

int main()

output

110, 20

100, 200, 300

first, 2, third, 3.14159

注意合併變引數模板函式的大多數實現使用某種形式的遞迴,但是它與傳統遞迴稍有不同。傳統遞迴涉及使用與程式設計客棧函式相同的簽名呼叫函式。(可以過載或模板化,但每次都要選擇相同的簽名。)可變遞迴使用不同(幾乎總是減少)數目的引數呼叫可變函式模板,因此每次都抹去不同的簽名。仍需要「基用例」,但是,遞迴性質是不同的。

本文位址: /ruanjian/c/140035.html

C 中的常量 表示式 函式

變數 變數定義 型別 識別符號 常量,含義 申請以識別符號命名的指定型別的儲存空間 訪問變數 物件占有記憶體的第乙個位元組的位址為物件位址 0x 通過物件名或位址進行讀寫訪問 指標型別變數定義 型別 識別符號 變數 初始賦值為0 null,為取址符,為解址符 含義 存放物件位址的變數 交換指標值 通...

通過常量表示式初始化的const變數定義在標頭檔案中

c primer 中,講到頭檔案中不可以包含定義,有三個例外 類,常量表示式初始化的const物件,inline。對於不是用常量表示式初始化的const物件,可以加上extern放在原始檔中,並在標頭檔案中加上extern宣告。但是對於用常量表示式 即編譯器就可以確定的 初始化的const物件,是不...

C 中的表示式

表示式是在運算元和運算子的基礎上構造而成。表示式的運算子指明了向運算元應用的運算。運算子的示例包括 和new。運算元的示例包括文字 字段 區域性變數和表示式。如果表示式包含多個運算子,那麼是運算子的優先順序決定了各個運算子的計算順序。例如,表示式 x y z相當於計算x y z 因為 運算子的優先順...