如何在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
相关产品推荐
相关产品推荐

