N2812は、値パラメーターとしてaが指定されているイントロダクションの例です。unique_ptr
void push_back2(
std::list<std::unique_ptr<int>>& l, std::unique_ptr<int> a)
{
l.push_back(a); // oops: moves from the lvalue 'a', silently!
l.push_back(a); // oops: 'a' no longer has its original value
}
この論文では、RValue/LValue オーバーロードの解決に関する問題について説明していますが、それは私の主張ではありません。
引数std::unique_ptr<int> a
を値で指定してもコンパイラ エラーが発生しないのだろうか? それはそれをコピーしますよね?そして、それは許可されていませんunique_ptr
論文がかなり古いことは承知しておりunique_ptr
、それ以来 の定義が変更されている可能性があります。しかし、それは単なるタイプミスであり、作者はstd::unique_ptr<int> &a
代わりに書きたかったのでしょうか?
私のgcc 4.7.0は私に同意しますが、それは証拠ではありません:-)
void push_back2( std::list<std::unique_ptr<int>>&, std::unique_ptr<int> ) { };
int main() {
list<unique_ptr<int>> lst;
unique_ptr<int> num { new int{4} };
push_back2(lst, num); //ERR: use of deleted function
}