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()));