有没有办法强制自动推导考虑 operator <some_type>() 而不是复制赋值?

Is there a way to force auto deduction to consider operator <some_type>() over copy assignment?

我有一个变量包装器,当底层变量通过这个包装器被修改时,它会发出变化信号,这样其他对象就可以侦听变化。

它工作正常(即我可以在底层对象上分配、添加、减去、调用成员函数(尽管它们无法发出更改信号)等),但有一点小问题:如果我这样做

struct some_object_type
{
  wrapper<int> some_wrapper;
}

int main()
{
  some_object_type some_object;
  auto value = some_object.some_wrapper;
}

value 这里被正确推导为 wrapper<int>。有什么方法可以使此构造的行为就好像 some_object.some_wrapper 属于 int 类型,以便将 value 推导为 int 变量?

@TartanLlama 在他的评论中有正确的解决方案。但是,如果您指定 auto const& value = ...,您希望 auto 推断出什么?在这种情况下,隐式转换将不起作用。

我以前 运行 遇到过这个问题,我能想到的最好的解决方案是提供一个 wrapper<T>::operator() 函数:

struct some_object_type
{
  wrapper<int> some_wrapper;
}

int main()
{
  some_object_type some_object;
  auto value1 = some_object.some_wrapper;  // deduces to wrapper<int>
  auto value2 = some_object.some_wrapper(); //deduces to int      
}

也许不是您所希望的解决方案,但除非您放弃自动类型推导,否则您最好的选择是@TartanLlama 的建议。