Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;11构造函数中的隐式实例_C++_C++11 - Fatal编程技术网

C++ C++;11构造函数中的隐式实例

C++ C++;11构造函数中的隐式实例,c++,c++11,C++,C++11,我在一些源代码中使用了这种代码,所以我尝试了它,它可以工作: struct B { int x, y; B (int _x, int _y): x(_x), y(_y) {} }; struct A { B b; A (B _b): b(_b) {} }; int main() { A a {{3, 4}}; return 0; } 谁能解释一下这个“隐式实例”是如何构造的,并告诉我它是在哪里被记录的?如果我理解正确,A{{3,4}是a

我在一些源代码中使用了这种代码,所以我尝试了它,它可以工作:

struct B {
    int x, y;

    B (int _x, int _y): x(_x), y(_y) {}
};

struct A {
    B b;

    A (B _b): b(_b) {}
};

int main()
{
    A a {{3, 4}};

    return 0;
}
谁能解释一下这个“隐式实例”是如何构造的,并告诉我它是在哪里被记录的?如果我理解正确,
A{{3,4}
a2{B{3,4}的快捷方式。这是正确的吗

例如,如果我重载构造函数,使它接受另一个可以用两个int构造的类,那么编译器如何理解我正在尝试获取一个新的隐式实例B


谢谢

A
中只有一个构造函数匹配带有两个参数的初始值设定项列表。如果您将第二个构造函数添加到
a
,例如,它采用类似于
B
的类
C
,那么它将是不明确的,并给出编译器错误


解决重载的完整规则有点复杂。例如,看一看。

Hmm。。“哪一个符合你的两个论点”我想有人会这么说,尽管这有点简化
{3,4}
是单个参数(初始值设定项,但不是表达式)。在[over.best.ics]/4iirc中有一条模糊的规则禁止使用这两个构造函数。这两个“你的两个参数”是什么?我只看到一个论点?我认为我的问题是,对这个问题的详尽回答是复杂的,可能超出了OP的范围;请参阅,例如,IMO您的简化现在描述了规则的意图。@dyp:您确定自动构造函数在用户定义的构造函数声明后仍然有效吗?@Deduplicator是的,它不是用户声明的复制/移动构造函数。否则,您将无法复制/移动该类型的对象(不显式定义/默认复制/移动系数和赋值操作)。不过,不会有编译器生成的默认构造函数。如果您添加了另一个重载,则该重载将包含两个参数,因此可以很容易地将其与当前重载区分开来,当前重载只包含一个参数。