gccから奇妙なエラーが発生しました。問題をより明確にするために、次のサンプルコードを作成しました。基本的には、私はそのコピーコンストラクタとコピー代入演算子をプライベートにして、誤って呼び出すのを防ぐためにクラスを定義しています。ベクトル:: push_backは、移動コンストラクタが用意されていますが、コピーコンストラクタを使用することを主張しています
#include <vector>
#include <cstdio>
using std::vector;
class branch
{
public:
int th;
private:
branch(const branch& other);
const branch& operator=(const branch& other);
public:
branch() : th(0) {}
branch(branch&& other)
{
printf("called! other.th=%d\n", other.th);
}
const branch& operator=(branch&& other)
{
printf("called! other.th=%d\n", other.th);
return (*this);
}
};
int main()
{
vector<branch> v;
branch a;
v.push_back(std::move(a));
return 0;
}
このコードはコンパイルすると期待していますが、gccで失敗します。実際にはgccは "branch :: branch(const branch &)は私的である"と訴えています。予想通り
代入演算子の作品、私はメインのボディを(置き換える場合以降)
branch a;
branch b;
b = a;
ではコンパイルして実行します。
これはgccの正しい動作ですか?もしそうなら、上記のコードに何が問題なのですか? 私にはどんな提案も役に立ちます。ありがとうございました!
gcc-4.6.1で動作します。 –
私はgcc 4.7.1-2を使用していました。 4.6.1を試してみよう。ありがとう! – BreakDS
私はN3242を読んだので、このコードは許されるべきです(しかし、ムーブコンストラクタが例外をスローした場合、プログラムは未定義の動作をします)。 – aschepler