【发布时间】:2014-05-01 14:08:03
【问题描述】:
我有一个包含几个简单成员的类,并且想实现一个非常简单的< 运算符。这是我开始的:
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 &'
似乎问题在于我没有使用成员,而是使用函数,并且正在将右值传递给非常量引用。我想我可以将 GetA() 保存在本地 A 中,但我宁愿不这样做。
我该如何解决这个问题?
我尝试添加
A& GetARef() const { return a; }
这不起作用,因为我试图用 const 返回一个非常量引用。
A& GetARef() { return a; }
这不起作用,因为 lhs 和 rhs 是 const。
现在我在想也许我应该使用std::tuple 或者std::tie( std::cref(lhs.GetA()) ),或者也许是一个新模板
template < typename... T >
std::tuple<const T&...> ctie( const T&... args )
{
return std::tie( args... );
}
但我不禁觉得我把这件事复杂化了……
【问题讨论】:
-
你试过用
std::forward_as_tuple代替std::tie吗? -
试试
const A& GetARef() const -
两者都有效。请不要在 cmets 中回答。
标签: c++ c++11 operator-overloading