gpt4 book ai didi

c++ - 为什么转换可以涉及两个用户定义的转换函数/构造函数?

转载 作者:行者123 更新时间:2023-11-30 03:25:37 25 4
gpt4 key购买 nike

我试图了解标准中的哪些规则证明了下面的编译器行为。所以这个问题只是为了得到一个语言律师的答案。

让我们考虑这两个类:

struct A{
A(int);
};
struct B{
operator int();
};

编译以下代码:

 B b;
A a{b};

变量a直接由ab初始化。根据[dlc.init]/17.6.3 :

Otherwise (i.e., for the remaining copy-initialization cases), user-defined conversion sequences that can convert from the source type to the destination type or (when a conversion function is used) to a derived class thereof are enumerated as described in [over.match.copy],

我理解直接初始化的过程会列出所有user-defined转换序列,可以执行从B(源类型)到A的转换,目标类型。 [over.match.copy] 解释在哪里可以找到用户定义的转换函数。

一个用户定义的转换序列只能涉及1个用户定义的转换函数或构造函数。但唯一的转换路径在于同时调用转换构造函数 A::A(int) 和转换函数 B::operator int()

因此没有用户定义的转换序列允许从 BA 的转换。

为什么按照标准初始化A a{b};可以良构?

最佳答案

它的格式是正确的,因为它使用一次转换将 B 转换为 int。然后显式调用 A 的构造函数,使用 int 作为参数。

在这种情况下,您有两个用户定义的转化:

  void f( A a ) {}
B b;
f( b );

关于c++ - 为什么转换可以涉及两个用户定义的转换函数/构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48916222/

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