GCC 和 Clang 之间从转换函数集中选择的重载不一致

2024-02-12

考虑一下这个example https://godbolt.org/z/WMncscaaq

#include <iostream>
struct T{
    T() = default;
    T(T const&)  =default;
};
T global;
struct S{
    operator T(){
        std::cout<<"#1\n";
        return T{};
    }
    operator T&(){
      std::cout<<"#2\n";  
      return global;
    }
};

int main(){
   S s;
   T obj(s);
}

海湾合作委员会选择#1当 Clang 选择时#2相反,我认为它们含糊不清。根据dcl.init#17.6.3 https://timsong-cpp.github.io/cppwp/n4861/dcl.init#17.6.3

否则(即,对于剩余的复制初始化情况),可以按照[over.匹配.复制],和通过重载决策选择最好的一个([over.match])。如果转换无法完成或不明确,则初始化格式错误。使用初始值设定项表达式作为其参数来调用所选函数;如果函数是构造函数,则调用是目标类型的 cv 无限定版本的纯右值,其结果对象由构造函数初始化。该调用用于根据上述规则直接初始化作为复制初始化目标的对象。

根据结束.match.copy#1.2 https://timsong-cpp.github.io/cppwp/n4861/over.match.copy#1.2

当初始化表达式的类型是类类型“cv S”时,考虑S及其基类的非显式转换函数。当初始化临时对象([class.mem])以绑定到构造函数的第一个参数时,其中参数的类型为“对 cv2 T 的引用”,并且在直接初始化的上下文中使用单个参数调用构造函数对于“cv3 T”类型的对象,还考虑显式转换函数。那些未隐藏在 S 中并产生 cv 未限定版本与 T 类型相同或其派生类的类型的函数是候选函数。对返回“对 X 的引用”的转换函数的调用是 X 类型的泛左值,因此这样的转换函数被认为在选择候选函数的过程中产生 X。

因此,无论#1 or #2,它们都被认为是yield类型T。它们都有隐式参数对象T&,因此 [over.match.best#2.1] 无法确定哪个是最好的

对于某些参数 j,ICSj(F1) 是比 ICSj(F2) 更好的转换序列,或者,如果不是这样,

能够确定哪种过载最好的唯一希望落在 [over.match.best#2.2] 上

上下文是通过用户定义的转换(请参阅 [dcl.init]、[over.match.conv] 和 [over.match.ref])以及从 F1 的返回类型到目标类型的标准转换序列进行的初始化(即正在初始化的实体的类型)是比从 F2 的返回类型到目标类型的标准转换序列更好的转换序列

它们的标准转换序列都是身份转换。因此,它们应该是含糊的。但GCC和Clang有各自的解释,并不一致。我想知道哪种解释是正确的?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GCC 和 Clang 之间从转换函数集中选择的重载不一致 的相关文章

  • 在c++中定义一堆静态方法

    哪个是合适的 class xyz static int xyzOp1 static int xyzOp2 OR namespace xyz static int xyzOp1 static int xyzOp2 当我们使用类标签与命名空间标
  • 全局变量不好

    好吧 读完这篇文章和一些示例后 我仍然不清楚全局变量的含义 那么你的类中的私有变量是全局的吗 http www c2 com cgi wiki GlobalVariablesAreBad http www c2 com cgi wiki G
  • 从服务器下载图像(cUrl,但接受建议)C++

    我试图通过从服务器 网站 下载图像来设置旋转背景图像 并尝试使用curl 来执行此操作 但是在执行此操作方面取得了0 成功 我的代码的 缩短的 版本如下 我没有收到错误 但是 如何 临时 保存该图像以将其显示为背景 是否有图像 类型变量 或
  • 如何在建立上下文时设置连接超时-PrincipalContext

    using PrincipalContext ctx new PrincipalContext ContextType Domain Domain UserName Password UserPrincipal U new UserPrin
  • 为什么 xcode IDE 认为 `friend` 是保留字

    我一直在开发一个个人项目 并在我创建的新类中包含以下代码 property readonly getter isFriend BOOL friend 它似乎没有任何问题 当我构建它时 它可以编译得很好 但是当我们在xcode IDE看起来像
  • C++:避免​​在重载中将字符串自动转换为布尔值

    我想创建一组方法 这些方法将根据其类型输出具有特殊格式的值 当我这样做时 到目前为止看起来还不错 static void printValue std ostringstream out int value out lt lt value
  • 我应该使用字节还是int?

    我记得曾在某处读到 即使您只需要字节 使用 Int32 更好 就性能而言 它 据说 仅适用于您不关心存储的情况 这是有效的吗 例如 我需要一个保存一周中某一天的变量 我是吗 int dayOfWeek or byte dayOfWeek E
  • 如何在 C++11 中返回类成员向量

    我读了几篇关于如何从方法返回向量的文章 其中包括 c11 右值和移动语义混淆返回语句 https stackoverflow com questions 4986673 c11 rvalues and move semantics conf
  • 将两个垂直滚动条相互绑定

    我在控件中有两个 TextBox 并且它们都有两个 VerticalScrollBar 我想在它们之间绑定 VerticalScrollBars 如果一个向上 第二个也会向上等等 如果可以的话我该怎么做 Thanks 不是真正的绑定 但它有
  • C 编程中的 rand() 问题? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么我总是用 rand 得到相同的随机数序列 https stackoverflow com questions 1108780 why do i always get the same seque
  • 向客户端发送状态码 500 时页面未呈现

    我有一个页面 通用处理程序 我想在该页面上向客户端返回状态代码 500 以指示出现问题 我这样做 Response StatusCode 500 Response StatusDescription Internal Server Erro
  • 为什么 C# 中的命名空间允许循环依赖?

    在 c 中 您可以在文件 a cs 其命名空间为 MyApp A 中拥有一条语句 using MyApp B 而文件 b cs 其名称空间为 MyApp B 已经包含该语句 using MyApp A 如果类似的依赖关系存在于不同的 dll
  • 括号内声明的对象的范围

    如果我声明一个这样的对象 void main myclass objectA anotherclass true true 0 即 我通过直接调用后者的构造函数来创建一个 objectA 和另一个对象 anotherclass anothe
  • ArrayList 有什么问题?

    最近我问了一个关于 SO 的问题 其中提到了可能使用 c ArrayList 来解决问题 有人评论说使用数组列表不好 我想了解更多有关此的信息 我以前从未听说过关于数组列表的这种说法 有人可以带我了解使用数组列表可能出现的性能问题吗 C n
  • 以编程方式阻止 Vista 桌面搜索 (WORDS) 对映射网络驱动器上的 pst 文件建立索引

    经过几天的多次尝试 我没有找到任何 100 的解决方案来解决这个问题 我的搜寻和调查范围 直接访问注册表 HKLM SOFTWARE Microsoft Windows Search CrawlScopeManager Windows Sy
  • C 中的 2 个字符要短

    我有2个字符 Char 128和查尔2 如何将这些字符转为 Short640 in C 我试过了 unsigned short getShort unsigned char array int offset short returnVal
  • C# 中的 mshtml.HTMLDocumentClass

    在 C 中 我设法从 InternetExplorer 对象获取整个 HTMLDocumentClass 导航到某个 URL 然而 在 Visual Studio 2008 的调试模式下 该特定 URL 的 HTMLDocumentClas
  • 为什么在一行中使用这个 C++ 函数两次会导致编译错误?

    我在尝试在 Visual C 2010 中实现智能相等测试宏类型模板函数时遇到了一些麻烦 该函数与VS 中关于模板函数默认参数的错误 https stackoverflow com questions 10343177 why do i g
  • C# 使用 .Equals() 比较两个 double

    我使用 ReShaper 当我用 比较两个双精度值时 它建议我应该使用 Math 具有公差的 ABS 方法 看 https www jetbrains com help resharper 2016 2 CompareOfFloatsByE
  • Web 和 winforms 的 .Net 身份验证

    我有一个为客户端构建的 ASP NET Web 应用程序 它使用默认的 ASP NET 表单身份验证 他们现在请求一个能够 与 Web 应用程序一起工作的桌面 WinForms 应用程序 我已经创建了 Web 服务来访问他们想要从 Web

随机推荐