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是的,它不是用户声明的复制/移动构造函数。否则,您将无法复制/移动该类型的对象(不显式定义/默认复制/移动系数和赋值操作)。不过,不会有编译器生成的默认构造函数。如果您添加了另一个重载,则该重载将包含两个参数,因此可以很容易地将其与当前重载区分开来,当前重载只包含一个参数。