繁体   English   中英

复制/转换构造函数定义(const / non-const)

[英]copy/conversion constructor definitions (const/non-const)

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

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;
}

几件事:

定义副本构造函数的const版本和非const版本是否有害? 我这样做的原因是,这显然有助于编译器与模板化构造函数区分开,即

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行似乎没问题,目的是用argc创建一个临时的A ,然后触发复制构造函数,但是我得到以下异常(gcc 4.4.4):

错误:请求'a1'中的成员'说',这是非类型'A(A)'

我相信这里发生的是编译器认为a1是一个函数定义,这正确吗? 如果是这样,编写特定代码行的正确方法是什么? 以下似乎是一个黑客!

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

ps请忽略所有样式上的foobar,为什么我要这样做...! :)

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

你是对的,可以作为函数声明的声明被视为函数声明。 它被称为C ++中“最令人烦恼的解析”。 一种解决方法是使用额外的括号 ,如T v(( U ))

可能是添加auto关键字也会修复它,我还没试过。 但是由于auto在C ++ 0x中获得了新的含义,因此即使习惯于在C ++ 98中解决该问题,习惯使用它也不是一个好主意。

干杯和健康。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM