我最近写了一段代码
SomeClass someObject;
mysqlpp::StoreQueryResult result = someObject.getResult();其中SomeClass::getResult()如下所示:
mysqlpp::StoreQueryResult SomeClass::getResult()
{
mysqlpp::StoreQueryResult res = ...<something>...;
return res;
}现在,使用第一个代码片段中的示例,当我编译和运行时,程序崩溃并发出ABORT信号。然后,我将第一个代码片段更改为:
SomeClass someObject;
mysqlpp::StoreQueryResult result(someObject.getResult());它工作得很好。此外,为了尝试一下,我再次将其更改为:
SomeClass someObject;
mysqlpp::StoreQueryResult result;
result = someObject.getResult();它也运行得很好。
现在,我只是弄不明白为什么第一个例子失败了,而接下来的两个例子成功了。据我所知,在第一个示例中,复制构造函数用于初始化结果。但这不也是第二个例子中的情况吗?那么为什么第二个例子会成功呢?第三个例子更有意义--因为没有使用复制常量,所以我们只是在构造之后赋值。
简而言之,这两者的区别是什么:
FooClass a = someObject.someMethodReturningFooClassInstance();和
FooClass a(someObject.someMethodReturningFooClassInstance());?谢谢!
发布于 2009-01-02 12:10:44
我不认为这两种情况有什么不同。两次都调用相同的复制构造函数。
您确定这就是您在代码中编写的内容吗?
发布于 2009-01-02 12:14:00
您只需在复制构造函数中放置一个断点(甚至是printf语句),您就可以确切地知道它被调用的时间。所以不能代替基本的调试。;)
但是的,在前两种情况下应该调用复制构造函数。第三种情况使用赋值运算符。
您是否尝试过在调试器中运行它?它应该在一个ABORT信号时中断。
发布于 2009-01-02 12:15:42
在最纯粹的理论中,这两种情况都应该调用复制构造函数。但是,在这些情况下,编译器可以使用一种称为返回值优化(RVO)的方法。如果使用RVO,则不会调用复制构造函数。也许您的编译器在一种情况下使用RVO,而在另一种情况下不使用RVO?
编辑:仅适用于案例
SomeClass someObject;
mysqlpp::StoreQueryResult result;
result = someObject.getResult();https://stackoverflow.com/questions/406613
复制相似问题