C++ 为什么这个代码可以删除一个副本?
可能的重复项:C++ 为什么这个代码可以删除一个副本?,c++,most-vexing-parse,C++,Most Vexing Parse,可能的重复项: 为什么这可以删除一个文件的所有副本 #include <iostream> class A { public: A() {} A(const A&) { std::cout << "Copy" << std::endl; } }; class B { public: B(const A& a_) : a(a_) {} private: A a; }; int main() { B b(A()); }
为什么这可以删除一个文件的所有副本
#include <iostream>
class A
{
public:
A() {}
A(const A&) { std::cout << "Copy" << std::endl; }
};
class B
{
public:
B(const A& a_) : a(a_) {}
private:
A a;
};
int main()
{
B b(A());
}
#包括
甲级
{
公众:
A(){}
(常数A&{std::cout)
你认为这是一个变量吗?不
它声明一个返回类型为b
的函数b
,并接受类型为a(*)(
)的参数
请参见本主题:
因此,如果您想声明一个变量,请在a()
周围加一个大括号,如下所示:
B b((A())); //it declares an object
问题不是抄袭省略,而是声明的含义:
B b(A());
// To get it working the way you expect [1]
B b = B(A());
// Or the slightly more obtuse.
B b((A()));
对于编译器来说是一个函数声明。Google/search搜索最烦人的解析。更多信息请参阅包含变通方法的部分
[1] :这不完全相同,因为这需要从A
隐式转换为B
。如果B
定义为:
class B {
A a;
public:
explicit B(const A& a_) : a(a_) {}
};
那么这将不是一个替代方案。使用:
B b((A()));
<>你的行是函数声明。不幸的是,C允许函数内声明(BTW对我来说似乎很没用),所以对于向后兼容性的原因,C++允许这样做。你可以用额外的括号来执行变量定义。;
几乎等同于B((A());
(只有当B(A)
构造函数是显式的时,才会出现差异)“戴维,为什么差不多?两个都是完全一样的。我认为<代码>显式< /C> >不是标准的C++。@ IAMMLIN:可以将构造函数标记为显式的,然后它将不被隐式转换使用。如果<代码> B<代码>被声明为<代码>结构B {显式B(const & {}}}); > <代码> B((a));将工作。(代码显式请求该构造函数),而B=A();
则不会,因为没有从A
到B
的隐式转换B=A();
由编译器作为B=B((A());
处理,其中左侧转换是隐式的。
B b((A()));