[是] 编译器 [...] 允许自动使用移动构造函数
是的,那会很好。但这不仅是一种优化,而且对语言有真正的影响。
考虑一个只移动类型,如unique_ptr
:
std::unique_ptr<int> f()
{
std::unique_ptr<int> up;
return up; // this is ok although unique_ptr is non-copyable.
}
假设您的规则将包含在 C++ 标准中,称为“参数最后出现”的规则。
void SetString(std::unique_ptr<int> data)
{
m_data = data; // this must be ok because this is "argument's last occurence"
}
检查返回中是否使用了标识符很容易。检查它是否是“参数的最后一次出现”不是。
void SetString(std::unique_ptr<int> data)
{
if (condition) {
m_data = data; // this is argument's last occurence
} else {
data.foo();
m_data = data; // this is argument's last occurence too
}
// many lines of code without access to data
}
这也是有效的代码。所以每个编译器都需要检查“参数的最后一次出现”,这不是一件容易的事。为此,他必须扫描整个函数以确定第一行是否有效。如果您必须向下滚动 2 页来检查这一点,作为人类也很难推理。
不,编译器不允许在 C++11 中使用。而且他可能不会在未来的标准中被允许,因为这个特性通常很难在编译器中实现,它只是为用户提供方便。