私が削除したコピー&移動ctorの持つクラスを持っています。のstd ::コピー不能のためのタプルと非可動オブジェクト
struct A
{
A(int a):data(a){}
~A(){ std::cout << "~A()" << this << " : " << data << std::endl; }
A(A const &obj) = delete;
A(A &&obj) = delete;
friend std::ostream & operator << (std::ostream & out , A const & obj);
int data;
};
そして、このクラスのオブジェクトでタプルを作成したいと思います。しかし、次のようにコンパイルされません。一方
auto p = std::tuple<A,A>(A{10},A{20});
を、以下はコンパイルを行いますが、意外な出力を提供します。
int main() {
auto q = std::tuple<A&&,A&&>(A{100},A{200});
std::cout << "q created\n";
}
出力
~A()0x22fe10 : 100
~A()0x22fe30 : 200
q created
これは、オブジェクトに対するデストラクタは、すぐタプル作図線が終了すると呼ばれていることを意味しています。だから、破壊されたオブジェクトのタプルの意味は何ですか?
'のstd ::タプル(A {100}、{200} A);'ありますダングリングリファレンスのタプル。私は 'std :: tuple p(100,200);が代わりに動作するはずです –
@PiotrSkotnicki clangまたはg ++でコンパイルされません:http://coliru.stacked-crooked.com/a/1fe2146b7881e241 – NathanOliver
@NathanOliver it 'libC++'またはそれより新しい 'libstdC++' –