gpt4 book ai didi

c++ - 为什么在这种情况下不调用复制构造函数?

转载 作者:太空宇宙 更新时间:2023-11-04 13:04:35 24 4
gpt4 key购买 nike

这是一小段代码:

class A
{
public:
A(int value) : value_(value)
{
cout <<"Regular constructor" <<endl;
}

A(const A& other) : value_(other.value_)
{
cout <<"Copy constructor" <<endl;
}

private:
int value_;
};
int main()
{
A a = A(5);
}

我假设输出将是“常规构造函数”(对于 RHS),然后是对于 LHS 的“复制构造函数”。所以我避免了这种风格,总是将类的变量声明为 A a(5);。但令我惊讶的是,上面的代码从未调用复制构造函数(Visual C++ 2008)

有人知道这种行为是编译器优化的结果,还是 C++ 的某些已记录(和可移植)功能的结果?谢谢。

最佳答案

来自另一条评论:“所以默认情况下我不应该依赖它(因为它可能取决于编译器)”

不,它实际上不依赖于编译器。任何值得一试的编译器都不会浪费时间构造一个 A,然后将其复制过来。

在标准中,它明确表示 T = x; 等同于说 T(x); 是完全可以接受的。 (§12.8.15,第 211 页)使用 T(T(x)) 显然是多余的,因此它删除了内部 T

要获得所需的行为,您需要强制编译器默认构造第一个 A:

A a;
// A is now a fully constructed object,
// so it can't call constructors again:
a = A(5);

关于c++ - 为什么在这种情况下不调用复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43008638/

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