了解初始化过程

Understanding the process of initialization

本文关键字:过程 初始化 了解      更新时间:2023-10-16

这是我试图理解类初始化是如何工作的。我对每件事都不确定,这就是我问这个问题的原因。当我们执行以下操作时,我认为会发生以下情况:

T t = u;
  1. u构造一个类型为T的对象。这就变成了:

    T t = T(u);
    
  2. 调用复制构造函数:

    T t( T(u) );
    

好的,第二个是我不明白的部分。我在某处读到T t = u被制成T t(T(u))。但如果这是真的,为什么不打印"copy-constructor":

struct T
{
  template <class U>
  T(U) {
     std::cout << "constructs an object of type T...n";
  }
  T(T const &)
  {
     std::cout << "copy-constructor";
  }
  T& operator=(T const &)
  {
     std::cout << "assignment operator"; return *this;
  }
  T() = default;
};
int main()
{
   T t(T(5));
}

实际上,这只是打印"构造一个T类型的对象"。为什么这里没有调用复制构造函数?T(5)可以构造为T const &类型的对象,该对象传递给T的构造函数,因此不应该调用相应的构造函数。

我真的想了解一下这个问题。我一直在努力理解这个

对于这种情况有一个特殊的规则。允许编译器跳过复制构造函数,即使它有副作用,只要带有复制构造函数的表达式是合法的。所以

T t = u;
如你所说,

等于

T t(T(u));

编译器跳过复制构造函数并将其视为

T t(u);

不允许这样做的一种情况是具有私有复制构造函数的类。在这种情况下,T t(T(u));将不合法,并且编译器将不允许通过跳过复制构造函数使其合法。