【发布时间】:2015-06-23 21:28:11
【问题描述】:
我正在尝试比较具有相同类型的常量引用和非常量可选对象。我有一个类型,NonCopy,它是不可复制的
#include <iostream>
#include <boost/optional.hpp>
struct NonCopy {
NonCopy() { }
NonCopy(const NonCopy&) = delete;
NonCopy& operator=(const NonCopy&) = delete;
};
int main()
{
NonCopy nc;
const NonCopy& object = nc;
boost::optional<NonCopy&> object2 = nc;
if (!object2 && object2.get() != object) {
std::cout << "not equal?\n";
}
}
产量
error: no match for ‘operator!=’ (operand types are ‘boost::optional_detail::types_when_is_ref<NonCopy&>::raw_type {aka NonCopy}’ and ‘const NonCopy’)
我尝试了多种主题变体,包括
if (object2 && const_cast<const NonCopy&>(object2.get()) != object)
这会产生一个非常有趣的错误
error: no match for ‘operator!=’ (operand types are ‘const NonCopy’ and ‘const NonCopy’)
并在boost::optional<NonCopy>(例如bool boost::operator!=(const boost::optional<NonCopy>&, const boost::optional<NonCopy>&))而不是NonCopy 上列出!= 的候选者。
【问题讨论】:
-
在我看来,这种类型根本没有可比性。
-
它是……陷入指针思维。我以为 != 会比较两个引用是否指向同一个对象
-
@Outurnate:您可以通过
&(object2.get()) != &object找到答案。或者,如果你真的很偏执,请使用std::addressof -
addressof... 这是一个新的。谢谢!
标签: c++ templates boost operator-overloading constants