gpt4 book ai didi

c++ - 为什么 C 类型泛型表达式不能与 C++ 兼容?

转载 作者:可可西里 更新时间:2023-11-01 16:21:25 25 4
gpt4 key购买 nike

我似乎记得从一些可靠的来源(即委员会成员在非官方 channel 中发言)听到模糊的评论说 C 类型泛型表达式不会添加到 C++,因为它们不能。

据我所知,与 C++ 模板和重载相比,类型泛型表达式非常有限,但没有可能需要定义为特殊情况的交互。

类型泛型表达式由控制表达式以及类型和子表达式之间的一系列“关联”组成。根据控制表达式的静态类型和为子表达式列出的类型选择子表达式,并用它代替 TGE。匹配基于类型兼容性的 C 概念,据我所知,这等同于单定义规则 (ODR) 下具有 extern 链接的 C++ 类型标识。

如果派生类控制表达式会选择 C++ 中的基类关联,那就太好了,但由于 C 没有继承,因此交叉兼容性不需要这种精确性。无论如何,这是否被视为绊脚石?

编辑:至于更具体的细节,C11 已经规定保留所选子表达式的值类别(左值),并且似乎要求 TGE 是常量表达式(无论是什么) category) 只要它的所有操作数都是,包括控制表达式。这可能是 C 语言的缺陷。无论如何,C++14 根据可能被评估的内容定义了常量表达式,并且 TGE 规范已经说明未选择的子表达式是未评估的。

关键是 TGE 的操作原理看起来足够简单,可以移植而不会在以后造成麻烦。

至于为什么 C++ 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';
}

最佳答案

“不可能”也许太强了。 “不确定是否可能”更有可能。

如果要将此功能添加到 C++,则应对其进行完整说明,包括与现有 C++ 功能的所有交互,其中许多功能在设计时并未考虑 _Generic。例如。 typeid 在 C 中不存在,但应该在 C++ 中工作。您可以将 _Generic 表达式用作 constexpr 吗?作为模板参数?它是 lvalue 吗?您可以获取它的地址并将其分配给函数指针,并获得重载决议吗?你能做模板参数推导吗?您可以将它与 auto 一起使用吗?等等

另一个复杂的问题是 _Generic 的主要用例是用于宏的,这与 C++ namespace 不兼容。 tgmath 中的 acos 示例就是一个明显的示例。 C++ 已经禁止 C 的标准宏并要求它们是函数,但这不适用于 tgmath.h

关于c++ - 为什么 C 类型泛型表达式不能与 C++ 兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20739428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com