我有一个包含一些简单成员的类,并希望实现一个非常简单的<
运算符。这就是我的开始:
inline bool operator< (const T& lhs, const T& rhs) { return std::tie(lhs.GetA(), lhs.GetB()) < std::tie(rhs.GetA(), rhs.GetB()); }
Visual Studio抱怨
Warning 2 warning C4239: nonstandard extension used : 'argument' : conversion from 'A' to 'A &'
似乎问题是我没有使用成员,而是使用函数,并且正在将rvalue传递给非const ref。我想我可以将GetA()保存在本地A中,但不愿意。
我该如何解决这个问题?
我尝试添加
A& GetARef() const { return a; }
这不起作用,因为我试图返回带有const的非const引用。
A& GetARef() { return a; }
这不起作用,因为lhs
和rhs
是常量。
现在我想也许我应该使用std::tuple
或std::tie( std::cref(lhs.GetA()) )
,或者可能是新模板
template < typename... T >
std::tuple<const T&...> ctie( const T&... args )
{
return std::tie( args... );
}
但是我忍不住觉得我过于复杂了......
答案 0 :(得分:5)
tie
生成 lvalue 引用的元组,因此不会对临时工作(除非它们是const
,因此扣除元组类型会给出const
引用)。
您可以使用make_tuple
制作对象元组,或forward_as_tuple
获取左值或 rvalue 引用,具体取决于参数&# 39;价值类别。
或者,您可以通过向const
成员返回const
引用来使访问者工作:
A const & GetARef() const { return a; }
^^^^^