我似乎回想起幾個可靠的來源(即委員會成員在非官方渠道發言)聽到模糊的評論,C型通用表達式不會被添加到C++,因爲他們不可能。爲什麼C類型的泛型表達式不能與C++兼容?
據我所知,與C++模板和重載相比,類型泛型表達式非常有限,但是沒有必要將定義爲特殊情況的交互潛力。
類型泛型表達式由控制表達式和類型與子表達式之間的一系列「關聯」組成。根據控制表達式的靜態類型和爲子表達式列出的類型選擇一個子表達式,並將其替換爲TGE。匹配基於C型概念的類型兼容性,據我所知可以等同於在單定義規則(ODR)下具有extern
鏈接的類型的C++身份。
如果一個派生類控件表達式在C++中選擇一個基類關聯,但由於C沒有繼承,所以交叉兼容性不需要這樣的細節。無論如何,這被認爲是一個絆腳石?至於更具體的細節,C11已經規定保留所選子表達式的值類別(左值),並且似乎要求TGE是一個常數表達式(任何類別的)作爲它的所有操作數,包括控制表達式。這可能是C語言的缺陷。在任何情況下,C++ 14都會根據可能被評估的內容定義常量表達式,並且TGE規範已經說過,未選擇的子表達式是未評估的。
問題是,TGE的操作原理似乎很簡單,以後可以移植而不會造成麻煩。
至於爲什麼 C++ TGE的將是有益的,除了最大限度地提高C和C++的交集,它們可以被用來基本上實現static_if
,SANS極具爭議的條件申報功能。我不是static_if
的支持者,但「有這個。」
template< typename t >
void f(t q) {
auto is_big = _Generic(std::integral_constant< bool, sizeof q >= 4 >(),
std::true_type: std::string("whatta whopper"),
std::false_type: "no big deal"
);
auto message = _Generic(t, double: "double", int: 42, default: t);
std::cout << message << " " << is_big << '\n';
}
也許負責解決通用問題的東西必須先找出能夠指出類是如何工作的。所以你不能泛化類,因此你將會擁有一個只適用於某些類型的特性。 – leewz
@leewangzhong那麼,它的工作方式與C相同。它可以適用於所有類型,只是不瞭解繼承。 – Potatoswatter
我的意思是,也許C++類型在泛型解析時無法識別。 – leewz