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

标签 c++

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

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'中的成员'say',它是非类类型'A(A)'

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

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

附注请忽略所有文体 foobars 以及我为什么要这样做......! :)

最佳答案

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

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

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

干杯。

关于c++ - 复制/转换构造函数定义(const/non-const),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4136762/

相关文章:

c++ - 如何正确格式化 C++ 注释?

c++ - 从任意原点求出两个 vector 之间的夹角

c++ - 服务器进程等待客户端输入/消息的最佳方式是什么

c++ - 二叉搜索树插入 C++

iphone - Cocoas2d 通过 CGPoint 获取 Sprite

c++ - 为什么我不能在 switch-case block 中实例化对象

c++ - 内部类的模板特化

c++ - 找到两个字符串 vector 的交集

c++ - std::array 的重载 () 运算符给出:错误 C2039: '()':不是 'std::array<_Ty,_Size>' 的成员

C++14:具有通用 std::function 作为类成员的通用 lambda