完美转发构造函数的consteval属性反向传递问题
consteval构造函数的包装类编译问题
1. 相关代码定义
首先是带有consteval构造函数的类,用于编译期校验值的有效性:
class ConstevalConstructible { public: consteval ConstevalConstructible(int value) : value_(value) { // 校验值有效性,无效则编译失败 } // 支持拷贝、移动等操作 private: int value_; };
另有一个通用包装结构体,通过完美转发构造函数初始化内部对象:
template <typename T> struct Wrapper { template <typename... Args> constexpr Wrapper(Args&&... args) : inner(std::forward<Args>(args)...) {} T inner; };
2. 编译问题场景
Wrapper的constexpr构造函数同时支持运行时和编译期构造,但在包装ConstevalConstructible时出现编译失败:
// 编译失败:Wrapper的constexpr构造函数非立即函数,无法调用consteval构造函数 Wrapper<ConstevalConstructible> foo{5}; // constinit也无法解决该问题 constinit Wrapper<ConstevalConstructible> foo{5}; // 仅显式构造对象再传入可行,但操作繁琐 Wrapper<ConstevalConstructible> bar{ConstevalConstructible{5}};
3. 问题核心
constexpr的评估逻辑是由外到内传递,而consteval属性需要由内到外传递——内部对象的consteval构造函数需要促使Wrapper的构造函数也成为consteval函数。类似noexcept的条件化机制,但C++20中没有条件化consteval的方法,尝试添加consteval重载但不知道如何进行约束。
提问
该问题在C20中是否可解决?若不可,未来C版本是否有相关规划?
内容的提问来源于stack exchange,提问作者rkjnsn
相关产品推荐
相关产品推荐

