'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;
};
一些值得注意的问题:
Val
的成员函数需要是public
.
Val
的构造函数不应该是explicit
来满足indirectly_readable
.
Val
的 operator=(Ref ref)
需要 return Val&
才能满足 sortable
.
Ref
需要添加 operator=(Val) const
重载以满足 indirectly_writable
.
我正在尝试使用 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;
};
一些值得注意的问题:
Val
的成员函数需要是public
.Val
的构造函数不应该是explicit
来满足indirectly_readable
.Val
的operator=(Ref ref)
需要 returnVal&
才能满足sortable
.Ref
需要添加operator=(Val) const
重载以满足indirectly_writable
.