3

考虑这段代码:

struct S
{
    template <typename T>
    operator T() const
    { return {}; }
};

struct R
{
    R() = default;
    R(const R&) = default;
    R(R&&) = default;
    R(bool) {}
};

标准在哪里为以下行为定义了规则?

S s;
R r1 = s; // (1) passes: T = R
R r2(s);  // (2) ambiguity: T = R or bool?

为什么(1)不会引起歧义问题(假设也R可以由它初始化bool)?我最近写了一个类似问题的答案,但我很好奇为什么(1)在这种情况下不像(2),我也不知道它在标准中的描述。

4

1 回答 1

2

8.5/15-16:

以大括号或相等初始化器条件以及 ...的=形式发生的初始化称为复制初始化

表单中发生的初始化

T x(a);
T x{a};

以及 ... 称为直接初始化

R r1 = s;复制初始化也是如此,R r2(s);直接初始化也是如此。关于第 17 段:

  • 如果目标类型是(可能是 cv 限定的)类类型:

    • 如果初始化是直接初始化,或者如果是复制初始化,其中源类型的 cv 非限定版本与目标类相同或派生类,则考虑构造函数。枚举了适用的构造函数(13.3.1.3),并通过重载决议(13.3)选择最佳构造函数。

    • 否则(即,对于剩余的复制初始化情况),可以从源类型转换到目标类型或(当使用转换函数时)到其派生类的用户定义转换序列被枚举,如 13.3 中所述。 1.4,最好的一个是通过重载决议(13.3)选择的。

所以直接初始化查看所有的构造函数R并最终变得模棱两可,而复制初始化显式地尝试将表达式R直接转换为并成功。

于 2017-04-15T23:33:58.757 回答