[英]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.