#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