将 boost::optional<T&> 与 const T& 进行比较
Comparing a boost::optional<T&> to const T&
我正在尝试比较同一类型的常量引用和非常量可选对象。我有一个类型,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
.
上列出 != 的候选项
由于 object2.get()
returns a NonCopy&
,您的示例有效地简化为:
NonCopy nc;
const NonCopy& object = nc;
NonCopy& object2 = nc;
object != object2; // error: no match for operator!=
这只是意味着您的类型 NonCopy
没有 operator!=
。实现它,你的代码就会编译。 boost::optional
与此处无关。
虽然请注意您正在检查:
if (!object2 && object2.get() != object)
^^^^^^^^ ^^^^^^^^^^^^^
object2 is none, but get it anyway?
这是未定义的行为。
我正在尝试比较同一类型的常量引用和非常量可选对象。我有一个类型,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
.
由于 object2.get()
returns a NonCopy&
,您的示例有效地简化为:
NonCopy nc;
const NonCopy& object = nc;
NonCopy& object2 = nc;
object != object2; // error: no match for operator!=
这只是意味着您的类型 NonCopy
没有 operator!=
。实现它,你的代码就会编译。 boost::optional
与此处无关。
虽然请注意您正在检查:
if (!object2 && object2.get() != object)
^^^^^^^^ ^^^^^^^^^^^^^
object2 is none, but get it anyway?
这是未定义的行为。