gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:04:57 24 4
gpt4 key购买 nike

据我所知,我认为 Foo a = 1 等同于 Foo a = (Foo)1

声明了复制构造函数,是的,它们都会导致调用转换构造函数

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。” 那不是相等的。第一个是一个构造函数调用,第二个是两个构造函数调用,但可以/必须省略一个调用。

关于c++ - 为什么转换构造函数需要在执行显式转换时声明复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66833773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com