【问题标题】:Cannot convert the second argument of the initializer-list无法转换初始化列表的第二个参数
【发布时间】: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) X is 考虑构造函数的 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(){ }

DEMO

虽然我提供了b 作为第一个参数并且不应该应用用户定义的转换B--&gt;C,但它可以工作。

【问题讨论】:

  • 您希望这个示例如何工作?您希望编译器通过什么转换顺序将B 的实例转换为const C&amp;
  • @IgorTandetnik 你是对的。它行不通。但是为什么coliru.stacked-crooked.com/a/52e1809738ba1057 可以正常工作?不应应用用户定义的转换B--&gt;C
  • 为什么不应该应用用户定义的转换?
  • 您没有进行复制初始化。您也没有将初始化列表作为单个参数传递。初始化器列表也不只有一个元素。您引用的段落与您的示例无关。
  • 该示例将B 传递给采用B 的构造函数。不涉及用户定义或其他方式的转换。

标签: c++


【解决方案1】:

您有一个从 BA 的转换以及从 CB 的转换,但是您正在尝试从 {B,C} 构造一个 A 并且没有构造函数那个表格。 . .

但现在你已经完全改变了它。 :)

【讨论】:

    猜你喜欢
    • 2019-02-27
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    相关资源
    最近更新 更多