为什么转换构造函数需要在执行显式转换时声明复制构造函数?

Why converting constructor needs copy constructor to be declared when explicit cast performed?

据我了解,我认为 Foo a = 1 等同于 Foo a = (Foo)1

声明复制构造函数后,是的,它们都会导致调用 Converting constructor

class Foo
{
public:
    // Converting constructor
    Foo(int n) : value_(n) { std::cout << "Converting constructor." << std::endl; }

    // Copy constructor
    Foo(const Foo&) { std::couut << "Copy constructor." << std::endl; }

private:
    int value_;
};

int main()
{
    Foo a = 1;         // OK - prints only "Converting constructor."
    Foo b = (Foo)1;    // OK - prints only "Converting constructor."
}

相比之下,如果没有复制构造函数,即使不调用复制构造函数也不会编译。

class Foo
{
public:
    // Converting constructor
    Foo(int n) : value_(n) { std::cout << "Converting constructor." << std::endl; }
    
    // Copy constructor deleted
    Foo(const Foo&) = delete;

private:
    int value_;
};

int main()
{
    Foo a = 1;         // OK - prints only "Converting constructor."
    Foo b = (Foo)1;    // Error C2280: 'Foo::Foo(const Foo &)': attempting to reference a deleted function
}

有什么不同? 谢谢。

Foo a = 1; 呼叫 Foo(int n)(Foo)1 也调用 Foo(int n)Foo b = (Foo)1; 调用复制构造函数 Foo(const Foo&)。在 C++17 之前,可以省略最后一个调用,但复制构造函数必须可用。由于 C++17 复制省略是强制性的,复制构造函数不是必需的:https://en.cppreference.com/w/cpp/language/copy_elision

可能您使用的是 C++17 之前的 C++ 标准,并且需要但未调用复制构造函数。

“据我了解,我认为 Foo a = 1 等同于 Foo a = (Foo)1。” 这并不等同。第一个是一个构造函数调用,第二个是两个构造函数调用,但省略了一个调用 can/must。