2015-07-03 53 views
3

我有一个Action类,看起来像这样(在其精简形式):对象会从返回的值不构成复制或移动构造

struct Action { 

explicit Action(...some parameters...); // I only use this to construct Action objects 

Action(const Action&) = delete; // Don't want copy constructor 
Action(Action&&) = delete; // Same for move constructor 

} 

在其他一些翻译单元,我曾尝试做到这一点:

Action action = someMethodForGettingActions(); // The method returns Action objects by rvalue 

Visual Studio的Intellisense希望为此挂我,有道理。它说它不能访问移动构造函数。 然而,这编译和运行如预期。这里发生了什么?这是否是一些编译器优化对我的玩法?

+0

具体哪一种intellisense解析器?并不是所有的IDE都使用相同的。 –

+0

我使用的是Visual Studio 2013. – Mark

+3

这利用了返回值优化,但编译器应禁止编译,因为您已经删除了'const Action&'构造函数,即使它实际上并不需要使用它。 – Dave

回答

2

这是一个Return Value Optimization在工作。它实际上被C++ 11标准所允许。检查的接受的答案:

c++11 Return value optimization or move?

的问题有一点不同,但得到的答复适合您的问题。

+0

所以编译器只是公然让你编译错误的代码,因为它知道它会被优化出来?现在RVO真的被认为是理所当然的吗? – Mark

+0

如果复制&移动构造函数被明确禁止,编译器仍然应该拒绝编译此类代码。他们没有实际使用的事实是无关紧要的。尝试使用GCC编译相同的代码。 – Dave

+0

@Dave它看起来(基于该链接引用的规范)实现既允许接受代码,也允许拒绝它,如果它不想为任何原因执行复制elision(注意“允许省略“)。 –