You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++23之前模拟auto(expr)类型转换特性?

用宏模拟C++23的auto(expr)特性

在C++23中,auto(expr)是一个纯右值(prvalue),其类型为expr的衰减类型,由expr拷贝初始化。

在旧C++标准下,可以用宏来模拟这个特性,但无法通过函数实现——因为将纯右值expr传递给函数时必然会使其物化,而auto(expr)绝不会物化纯右值expr。下面是几种常见的错误实现:

  • 第一种错误实现:
#define AUTO(expr) static_cast<std::decay_t<decltype(expr)>>(expr)

当expr包含lambda时无法编译,原因是重复expr会创建两个不同类型的lambda,导致类型不匹配。

  • 第二种错误实现:
#define AUTO(expr) [&]() { return expr; }()

存在两个问题:一是捕获默认值&在命名空间域中是非法的;二是如果expr的结果持有对expr内部创建的临时对象的引用,这些临时对象会在lambda返回前销毁,引发悬垂引用问题。

我能想到的最接近的实现如下:

#define AUTO(expr) (true ? (expr) : ConvertsToAnything())

其中ConvertsToAnything定义了模板转换运算符template <class T> operator T();,可以转换为任意类型的纯右值。这个实现几乎在所有场景下都能正常工作,但存在一个缺陷:当expr是带cv限定的纯右值时,auto(expr)会剥离cv限定,而上述宏无法做到这一点。

我曾见过一种能完美模拟auto(expr)行为的精妙宏,但已记不清其实现方式。

内容的提问来源于stack exchange,提问作者Brian Bi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 18:52:15