[is]コンパイラ[...]moveコンストラクタを自動的に使用することを許可
はい、いいですね。しかし、これは最適化であるだけでなく、言語に実際の影響を及ぼします。
次のような移動専用タイプを考えてみましょう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ではコンパイラは許可されていません。また、この機能は一般にコンパイラーで実装するのが非常に困難であり、ユーザーにとって便利であるため、将来の標準ではおそらく許可されません。