了解初始化过程

时间:2013-04-07 17:05:25

标签: c++

这是我尝试理解类初始化的工作原理。我不确定所有事情,这就是我问这个问题的原因。这是我认为在我们执行以下操作时会发生的情况:

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

    T t = T(u);
    
  2. 调用copy-constructor:

    T t( T(u) );
    
  3. 好的第二个是我不理解的部分。我读到T t = uT 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的构造函数,因此不应调用相应的构造函数。

    我真的很喜欢这方面的一些见解。我一直试图理解这一点。

1 个答案:

答案 0 :(得分:4)

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

T t = u;
正如你所说,

相当于

T t(T(u));

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

T t(u);

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