我似乎记得从一些可靠来源(即委员会成员在非官方渠道中发言)听到过模糊的评论,即 C 类型泛型表达式不会添加到 C++ 中,因为它们不能添加。
据我所知,与 C++ 模板和重载相比,类型泛型表达式非常有限,但不存在需要定义为特殊情况的交互潜力。
类型通用表达式由控制表达式以及类型和子表达式之间的一系列“关联”组成。根据控制表达式的静态类型和为子表达式列出的类型选择子表达式,并替换 TGE。匹配基于类型兼容性的 C 概念,据我所知,这相当于具有以下类型的 C++ 标识:extern
单一定义规则(ODR)下的链接。
如果派生类控制表达式能够选择 C++ 中的基类关联,那就太好了,但由于 C 没有继承,因此交叉兼容性不需要这种精确性。无论如何,这是否被认为是一个绊脚石?
Edit:至于更具体的细节,C11 已经提供了保留所选子表达式的值类别(左值性)的功能,并且似乎要求 TGE 是一个常量表达式(无论类别),只要它的所有操作数都是,包括控制表达。这可能是C语言的一个缺陷。无论如何,C++14 根据可能评估的内容定义常量表达式,并且 TGE 规范已经规定未选择的子表达式不会被评估。
关键是,TGE 的操作原理看起来很简单,可以移植,以后不会造成任何麻烦。
As for whyC++ TGE 将会很有用,除了最大化 C 和 C++ 的交集之外,它们还可用于本质上实现static_if
,没有备受争议的条件声明功能。我不支持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';
}