如何解决std::common_reference<Ref&&, const Val&>不存在type成员的编译错误
解决
std::common_reference<Ref&&, const Val&>无type定义的问题 问题根源
std::common_reference的类型推导逻辑不依赖自定义的operator&重载,你提供的取址运算符不会参与公共引用类型的计算,所以重载这个运算符无法解决问题。
解决方案
你需要手动特化标准库的std::basic_common_reference模板,显式声明两个类型的公共引用规则,同时保证两类之间的转换符合语义要求,修改后的可编译代码如下:
#include <type_traits> class Ref {}; class Val { public: // 保证Val可隐式转换为Ref,符合公共引用的语义要求 constexpr operator Ref() const noexcept { return {}; } }; // 双向特化basic_common_reference,适配所有限定符组合 template<template<class> class TQual, template<class> class UQual> struct std::basic_common_reference<Ref, Val, TQual, UQual> { using type = TQual<Ref>; }; template<template<class> class TQual, template<class> class UQual> struct std::basic_common_reference<Val, Ref, TQual, UQual> { using type = UQual<Ref>; }; int main() { std::common_reference_t<Ref&&, const Val&> t; return 0; }
Boost.STLInterfaces代理迭代器适配注意事项
- 如果你的迭代器
value_type为Val、reference类型为Ref,需要额外保证Ref可隐式转换为Val,如果是可变迭代器,还要保证对Ref的赋值操作可以正确修改底层存储的Val对象 - 重载
operator&是非标准的过时实现方案,不符合C++20及之后的迭代器概念校验规则,不要继续使用
内容的提问来源于stack exchange,提问作者SD57
相关产品推荐
相关产品推荐

