'struct std::common_reference<Ref&&, const Val&>' 中没有名为 'type' 的类型

No type named 'type' in 'struct std::common_reference<Ref&&, const Val&>'

我正在尝试使用 Boost.STLInterfaces 编写代理迭代器。 编译失败是因为value的左值引用和引用的右值引用不同,在Compiler Explorer https://godbolt.org/z/aE3bq7en4上查看简化版。 如何使两种类型具有共同的参考? 我尝试将 addressof 运算符重载为 return 引用类型,但编译了一个提炼示例

#include <type_traits>

class Ref {};
class Val {};

// overload addressof operator
constexpr Ref operator&(Val) noexcept;
constexpr Ref operator&(Ref) noexcept;

int main()
{
  std::common_reference<Ref&&, const Val&>::type t;
  return 0;
}

失败

error: no type named 'type' in 'std::common_reference<Ref &&, const Val &>'

这种情况下,需要偏特化std::basic_common_reference来定义两者的公共引用,类似这样:

template<template<class> class TQual, template<class> class UQual>
struct std::basic_common_reference<Ref, Val, TQual, UQual> { 
  using type = Val;
};

template<template<class> class TQual, template<class> class UQual>
struct std::basic_common_reference<Val, Ref, TQual, UQual> { 
  using type = Val;
};

Demo.

一些值得注意的问题:

  • Val的成员函数需要是public.
  • Val的构造函数不应该是explicit来满足indirectly_readable.
  • Valoperator=(Ref ref) 需要 return Val& 才能满足 sortable.
  • Ref 需要添加 operator=(Val) const 重载以满足 indirectly_writable.