我一直在認真研究C++中的模板,我發現它似乎有挑戰性,似乎沒有一套嚴格的術語來明確識別和區分/消除每個語法元素可以使用模板出現。C++中與模板相關的語法元素的名稱分類
例如,Josuttis和Vandevoorde關於模板的經常參考的書()是一本傑出的書,但即使是那本書也沒有清楚地確定每個涉及模板的句法元素的嚴謹術語。相反,從上下文來看意義是清楚的。
請考慮下面這個簡單的例子,我相信它會突出顯示涉及模板的11個不同的相關語法組件。
#include <iostream>
#include <vector>
template
<
typename
M1, // <-- (1) "Primary template declaration template parameter
// identifier"
typename M2 // ditto
> // <-- (2) (entire <...> syntactic element) "Primary template declaration
// template parameter list"
class Foo
{
// <-- (3) "Primary class template definition"
};
template
<
typename
T1, // <-- (4) "Template specialization declaration template
// parameter identifier"
typename A1, typename M2 // ditto
> // <-- (5) (entire <...> syntactic element) "Template specialization
// declaration template
// parameter list"
class Foo
<
std::vector<T1, A1> &, // <-- (6) "Template specialization
// declaration TEMPLATE PARAMETER
// SPECIALIZATION ARGUMENT"
// (?)
M2
> // <-- (7) (entire <> syntactic element) "Template specialization
// declaration TEMPLATE PARAMETER
// SPECIALIZATION ARGUMENT LIST"
// (?)
{
// <-- (8) "Template specialization class definition"
};
int main()
{
Foo
<
std::vector<int> &, // <-- (9) "Template class instantiation
// template parameter"
// (?)
int // diito
> // <-- (10) (entire <> syntactic element) "Template class
// instantiation template
// parameter list"
// (?)
f; // <-- (11) "Template class instantiation instance variable name"
}
在代碼示例中,我已經指出了11個不同的與模板相關的語法元素,並提供了我對每個元素建議的嚴格分類標籤。
我懷疑我對這些元素中的大多數使用了正確的分類標識符(但如果我錯了,請糾正我)。 (6),(7),(9)和(10)是棘手的 - 例如,在(6)和(7)的情況下,存在模板專業化的情況,在該對角撐架<>
的出現兩次,所以必須有在用於指示所述角括號內爲這兩種截然不同的對角撐架之間出現的參數(參數?)的標識符的分類學區分。模板實例(9)和(10)還包括另一使用尖括號的,所以那些括號內出現的參數必須有自己的識別分類標識符,以及。
也許,在這個問題上,我已經使用了適當的嚴謹的術語,但我想知道:
有沒有更簡單的嚴謹的術語比我用什麼呢?
我是否在識別標籤中使用了無關和/或不必要的字詞?
是否有丟失我的識別標籤中的單詞?
我正確的識別標籤我用過嗎?
您的仔細研究是否包含C++標準的相關章節(14)?這足夠嚴格地定義語法來編寫編譯器;你認爲缺少什麼? –
沒有好想法。我去做。如果有人有時間在這裏總結和發佈相關的語法標識符,那將回答我的問題並協助努力研究標準。 –
語法概要在附錄A.12中,但我沒有權限在此處發佈。 –