【发布时间】:2014-11-25 13:15:50
【问题描述】:
标准说:(N3797::13.3.3.1/4 [over.best.ics])
但是,当考虑构造函数的参数或 用户定义的转换函数,它是 13.3.1.3 的候选函数,当 在第二步中调用用于临时复制/移动 13.3.1.7 传递初始化器时的类复制初始化 列表作为单个参数或当初始化列表正好有一个 元素和转换为某个类
X或引用(可能 cv-qualified)Xis 考虑构造函数的 first 参数 在X中,[...] 只考虑标准转换序列和省略号转换序列。
那是我们只在以下情况下才关心第一个参数:
#include <iostream>
struct B;
struct C
{
C(){ }
C(const B&){ }
};
struct B
{
B(){ }
B(const C&){ }
};
struct A
{
A(const C&, const C&){ }
A(const B&){ }
};
B b;
C c;
A a{b, b};
int main(){ }
虽然我提供了b 作为第一个参数并且不应该应用用户定义的转换B-->C,但它可以工作。
【问题讨论】:
-
您希望这个示例如何工作?您希望编译器通过什么转换顺序将
B的实例转换为const C&? -
@IgorTandetnik 你是对的。它行不通。但是为什么coliru.stacked-crooked.com/a/52e1809738ba1057 可以正常工作?不应应用用户定义的转换
B-->C。 -
为什么不应该应用用户定义的转换?
-
您没有进行复制初始化。您也没有将初始化列表作为单个参数传递。初始化器列表也不只有一个元素。您引用的段落与您的示例无关。
-
该示例将
B传递给采用B的构造函数。不涉及用户定义或其他方式的转换。
标签: c++