次のプログラムは、VS11 ベータ版、gcc 4.5、または clang 3.1 ではビルドされません。
#include <thread>
#include <memory>
int main() {
std::unique_ptr<int> p;
std::thread th([](std::unique_ptr<int>) {
},std::move(p));
th.join();
}
これは、引数の型がコピー可能ではないためですが、実装はそれをコピーしようとします。
私が知る限り、このプログラムは適切に構成されており、機能するはずです。std::thread の要件は、移動可能でコピー不可能な引数がここで機能することを暗示しているようです。具体的には、呼び出し可能なオブジェクトと各引数が MoveConstructible の要件を満たし、INVOKE(DECAY_COPY(std::forward<F>(f)),DECAY_COPY(std::forward<Args>(args))...)
有効な式である必要があることを示しています。
この場合、式は次のように機能すると思います。
template <class T> typename std::decay<T>::type decay_copy(T&& v)
{ return std::forward<T>(v); }
std::unique_ptr<int> p;
auto f = [](std::unique_ptr<int>) {};
decay_copy(f)(decay_copy(std::move(p)));
そして、これは のコピーを含むべきではないと思いますp
。gcc は少なくともこの式をコンパイルできますが、VS11 はコンパイルできません。
- 要件について間違っていますか?引数はコピー可能でなければなりませんか?
- 標準は、実装が引数をコピーするために、この問題に余裕を残していますか?
- または、私が試した実装は準拠していませんか?