#include <iostream>
struct Box
{
Box() { std::cout << "constructor called" << std::endl; }
Box(const Box&) { std::cout << "Copy constructor called" << std::endl; }
Box(Box&&) { std::cout << "Move constructor called" << std::endl; }
void run() const { std::cout << "Run" << std::endl;}
};
int main()
{
Box a(Box());
a.run();
}
在上面的代碼我期待任一Copy Constuctor
或Move Constructor
到在經過匿名對象Box()
作爲參數來調用。但是他們都沒有被召喚。原因可能是copy elision
。但是即使是構造函數也不會被要求匿名對象A()
。實際上,上面的代碼並沒有編譯和調用run()
函數編譯器給出了以下錯誤。
a.cpp: In function ‘int main()’:
a.cpp:28:7: error: request for member ‘run’ in ‘a’, which is of non-class type ‘Box(Box (*)())’
a.run();
因此,當我們輸入Box a(Box())
發生了什麼?正在創建什麼?
你被MVP咬了。它認爲'Box a(Box());'是一個名爲'a'的函數聲明,返回一個'Box'。 – Borgleader
@YSC我不確定我是否同意你的格式 - 我更喜歡以前的版本。 – pingul
@pingul較短的代碼傾向於吸引更多的注意力,所以我的編輯沒有(我希望)改變OP的原意。但它絕對是他們的回撥。 – YSC