我可以将调用复制构造函数的两种语法分成两种不同的方法吗?

Can I separate the 2 types of syntax that call copy constructors into 2 different methods?

由于可以通过使用与参数相同类型的另一个对象构造或通过赋值来调用复制构造函数,所以我想知道是否可以将两者分开。

我尝试制作 2 个变体(唯一的区别是用于复制对象的代码行)并为两者生成程序集,但程序集输出完全相同,这让我相信这是不可能的区分它们,除非它只是 'optimised out'.

我可以有 2 个不同的复制构造函数,一个用于 Thing thing2(thing1),一个用于 Thing thing2 = thing1 吗?

#include <iostream>
class Thing {
public:
    Thing() {
    }
    Thing(const Thing& from) {
        std::cout << "Copy constructor\n";
    }
};
int main()
{
    Thing thing1;
    Thing thing2(thing1); // This line is identical
    Thing thing3 = thing1; // to this one
    return 0;
}

是的,在您的特定示例中,您可以像这样区分这两个版本:

class Thing {
public:
    Thing() {
    }
    explicit Thing(Thing& from) {
        std::cout << "Constructor One\n";
    }
    Thing(Thing const&) {
        std::cout << "Constructor Two\n";
    }
};

现在初始化将调用不同的构造函数:

int main()
{
    Thing thing1;
    Thing thing2(thing1);  // Constructor One  
    Thing thing3 = thing1; // Constructor Two
    return 0;
}

这里是 demo

请注意,这仅适用于您的示例,因为 thing1 是 non-const。如果它是 const,那么两个初始化版本都会调用第二个构造函数。