gpt4 book ai didi

c++ - 为什么 C++ 选择将我的返回值转换为 int?

转载 作者:太空狗 更新时间:2023-10-29 23:26:29 24 4
gpt4 key购买 nike

出于各种无聊的原因,我需要一个装箱的 int 类,它主要充当 int,但它是一个从基类继承的类,因此它可以与对象层次结构的其他部分一起工作。我包含了一个采用 int 和 int 转换的构造函数,因此我可以轻松地将我的盒装 int 与代码中的常规 int 混合。但是,我看到一个我无法弄清楚的非常奇怪的行为:当我从一个函数返回我的装箱 int 时,我希望它使用我的复制构造函数来引用另一个 BoxedInt。但是,它会将我的盒装 int 转换为 和 int,然后使用我的 int 构造函数。这会导致问题,因为在我的实际代码库中,在这种情况下我想复制其他基类属性,并且通过采用此转换/构造函数路径丢失了它们。这是有问题的代码:

class BoxedInt
{
private:
int m_int;
public:
BoxedInt():m_int(0)
{
trace(L"Constructed with nothing");
}

BoxedInt(int val):m_int(val)
{
trace(L"Constructed with int");
}

BoxedInt(BoxedInt& val)
{
trace(L"Constructed with reference");
m_int = val.m_int;
}

operator int()
{
trace(L"Cast to int");
return m_int;
}
};

BoxedInt funky()
{
BoxedInt TempInt = 1;
return TempInt;
}

int main(int argc, char* argv[])
{
trace(L"Start");
BoxedInt test1 = 1;
trace(L"Copying");
BoxedInt test2 = test1;
trace(L"Assigning from return value");
BoxedInt test3 = funky();
trace(L"Done");
return 0;
}

运行时,输出如下:

Start
Constructed with int
Copying
Constructed with reference
Assigning from return value
Constructed with int
Constructed with reference
Cast to int
Constructed with int
Done

因此,当我将一个值赋给另一个值时,将使用基于引用的构造函数,正如我所期望的那样。但是,当我将函数的返回值分配给 BoxedInt 时,出于某种原因,编译器决定转换为 int,然后使用 int 构造函数。我的 C++ 生锈了,我无法深入了解这个我似乎无法抵消的奇怪的编译器决定。有什么想法吗?

最佳答案

你的复制构造函数引用了一个非常量,所以它不能用临时调用。的返回值funky() 是临时的,所以不能使用拷贝构造函数构造test3

让复制构造函数接受一个常量引用,它应该没事。

关于c++ - 为什么 C++ 选择将我的返回值转换为 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19386632/

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