[英]C++ Basic CTOR clarification - why the assignment / copy constructor is not being called
下面是我的示例程序:
当我编译并运行以下程序时,我得到输出:
#include <iostream>
class A
{
public:
explicit A()
{
std::cout << "A CTOR\n" << std::flush;
}
~A()
{
std::cout << "A DTOR\n" << std::flush;
}
A(const A & a)
{
std::cout << "A DEEP COPY CTOR\n" << std::flush;
}
void operator = (const A & a)
{
std::cout << "A DEEP COPY = CTOR\n" << std::flush;
}
A(A && a)
{
std::cout << "A DEEP COPY MOVE CTOR\n" << std::flush;
}
void operator = (A && a)
{
std::cout << "A DEEP COPY MOVE = CTOR\n" << std::flush;
}
};
int main()
{
A a = A();
A b(A());
}
编译并运行二进制文件:
$ c++ -std=c++14 try47.cpp
A CTOR
A DTOR
我期待 A 的默认构造函数将被调用,然后在第一行中复制赋值 ctor 并在第二行中移动 ctor? 但这似乎不会发生? 为什么? 我想我在这里缺少一些基本的理解?
请说明什么时候会实际调用哪些 CTOR?
不要让=
运算符让您失望。 第一行中发生的只是一个默认的构造函数调用。 有没有必要拷贝赋值(编译elides本),因为你不分配给任何a
。
但以下将导致您正在寻找的内容:
A a, c; //A CTOR
c = a; //A DEEP COPY = CTOR because c is being assigned the value of a
第二行只是一个函数声明。
A b(A());
b
是一个将A
作为参数并返回A
的函数。 这种歧义通常被称为最令人头疼的解析。
CPP 标准草案 (N4713) 指出:
9.8 歧义解析 [stmt.ambig]
在涉及表达式语句和声明的语法中存在歧义:将函数式显式类型转换作为其最左侧子表达式的表达式语句可能与第一个声明符以 ( 开头的声明无法区分。在这些情况下,语句是声明。
[注意:如果语句在语法上不能是声明,则没有歧义,因此此规则不适用。 可能需要检查整个语句以确定是否是这种情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.