代码之家  ›  专栏  ›  技术社区  ›  Nim

复制/转换构造函数定义(常量/非常量)

c++
  •  0
  • Nim  · 技术社区  · 14 年前

    让我用一个简单的例子来演示:

    class A
    {
    public:
      A() { cout << "A::A()" << endl; }
      A(A const& a) : _a(a._a) { cout << "A::(A Copy Const)" << endl; }
      A(A& a) : _a(a._a) { cout << "A::(A Copy)" << endl; }
    
      template <typename _T1>
      A(_T1& v1) : _a(v1) { cout << "A::(T conversion)" << endl; }
    
      ~A() { cout << "A::~A()" << endl; }
    
      void say() { cout << "A::say()" << endl; }
    
    private:
      int _a;
    };
    
    int main(int argc, char* argv[])
    {
      A a1(A(argc)); // Line 1: ERM?
    
      a1.say();
    
      return 0;
    }
    

    定义复制构造函数的常量和非常量版本有什么危害吗?我这样做的原因是,这显然有助于编译器区别于模板构造函数,即。

    A const a1(argc);
    A a2(a1); // <-- correctly call the const copy ctor
    
    A a3(argc);
    A a4(a3); // <-- correctly call the non-const copy ctor
    

    是否有更好的方法来确保在上面的示例中,复制构造函数总是在模板构造函数之上调用?

    第二,从纯编码的角度来看,第1行似乎没问题,其目的是创建一个临时的 A 具有 argc ,然后触发复制构造函数,但是我得到以下异常(gcc 4.4.4):

    错误:请求成员,如a1中的成员,该成员属于非类类型A(A)

    我相信这里发生的是编译器认为 a1 函数定义正确吗?如果是这样,那么正确的方法是什么?下面看来是一个黑客!

    A a1(true ? A(argc) : A());
    

    p、 请忽略所有的风格美食家和我为什么要这样做。。。!:)

    1 回复  |  直到 14 年前
        1
  •  2
  •   Cheers and hth. - Alf    14 年前

    模板构造函数永远不是(正式的)复制构造函数。

    附加括号 ,就像 T v(( U ))

    可能是添加了 auto 汽车 在C++0X中获得新的含义,即使使用C++ 98中的问题,也可能不习惯使用它。