gpt4 book ai didi

c++ - 用户自定义算子转换解析顺序

转载 作者:行者123 更新时间:2023-12-05 08:03:07 25 4
gpt4 key购买 nike

是否可以配置用户定义的运算符的解析顺序?考虑以下代码:

#include <memory>
#include <utility>

using P = std::unique_ptr<int>;

struct S{
P p;

operator P() && { return std::move(p); }
operator const P&() const { return p; }
};

S s{std::make_unique<int>()};
P p;
p = std::move(s);

编译失败:

In file included from /opt/compiler-explorer/gcc-12.1.0/include/c++/12.1.0/memory:76,
from <source>:1:
/opt/compiler-explorer/gcc-12.1.0/include/c++/12.1.0/bits/unique_ptr.h:406:19: note: candidate: 'std::unique_ptr<_Tp, _Dp>& std::unique_ptr<_Tp, _Dp>::operator=(std::unique_ptr<_Tp, _Dp>&&) [with _Tp = int; _Dp = std::default_delete<int>]'
406 | unique_ptr& operator=(unique_ptr&&) = default;
| ^~~~~~~~
/opt/compiler-explorer/gcc-12.1.0/include/c++/12.1.0/bits/unique_ptr.h:515:19: note: candidate: 'std::unique_ptr<_Tp, _Dp>& std::unique_ptr<_Tp, _Dp>::operator=(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete<int>]' (deleted)
515 | unique_ptr& operator=(const unique_ptr&) = delete;

似乎编译失败是因为删除的复制赋值和默认的移动赋值运算符之间存在歧义。

为什么编译器无法解析这里的操作?有没有一种方法可以定义运算符来实现这一点?

最佳答案

如果这些运算符应该是转换运算符,您可以这样定义它们:

operator P() && { return std::move(p); }
operator const P&() & { return p; }

Demo

第二个运算符需要左值引用限定符(末尾的 &),因为没有它,隐式对象参数也可以是右值。这种情况也包含在右值引用限定版本中,因此调用变得不明确。如果添加 const 限定符也是一样,因为右值可以绑定(bind)到 const 左值引用。

关于c++ - 用户自定义算子转换解析顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74187665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com