2

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

T t = u;
  1. 从构造一个类型的T对象u。然后变成:

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

    T t( T(u) );
    

好的,第二个是我不理解的部分。我在某个地方读到T t = uT t(T(u)). 但如果这是真的,为什么不打印“复制构造函数”:

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因此不应该调用适当的构造函数。

我真的很想对此有所了解。我一直试图理解这一点。

4

1 回答 1

4

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

T t = u;

正如你所说,相当于

T t(T(u));

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

T t(u);

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

于 2013-04-07T17:14:09.037 回答