這是我錯過的東西,但我很驚訝。考慮下面的代碼示例:爲什麼在按值傳遞右值時調用的複製構造函數不起作用
#include <iostream>
class A
{
int a;
public:
A(int a) : a(a) { std::cout << "Normal constructor called." << std::endl; }
A(const A& orig) : a(orig.a) { std::cout << "Copy constructor called." << std::endl; }
};
void testFunction1(const A arg) { std::cout << "testFunction1()" << std::endl; }
void testFunction2(const A& arg) { std::cout << "testFunction2()" << std::endl; }
int main()
{
testFunction1(A(2));
testFunction2(A(2));
return 0;
}
我希望以下結果:
/* Normal constructor called. */
/* Copy constructor called. */
/* testFunction1() */
/* Normal constructor called. */
/* testFunction2() */
但是我錯了。確切的結果如下:
/* Normal constructor called. */
/* testFunction1() */
/* Normal constructor called. */
/* testFunction2() */
爲什麼不叫當我走過A(2)
按值testFunction1()
拷貝構造函數?這是否意味着在C++ 98中通過值或引用傳遞右值沒有區別?這是一種優化嗎?是A(2)
和arg
完全一樣對象在testFunction1()
?
可能是[* copy elision *](https://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization)。 –
@Someprogrammerdude - 謝謝,我會檢查它。從來沒有聽說過。 –
如果你從來沒有聽說過這個,那麼你可能會閱讀一些很好的C++書籍......強烈推薦** Meyers **和** Sutter **書籍。 – Phil1970