vector ::push _back настаивает на использовании конструктора копирования, хотя предоставляется конструктор перемещения

Я получал странную ошибку от gcc и не могу понять, почему. Я сделал следующий пример кода, чтобы сделать проблему более ясной. По сути, есть определенный класс, для которого я делаю его конструктор копирования и оператор присваивания закрытыми, чтобы предотвратить их случайный вызов.

#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 жалуется, что "ветвь ::ветвь (const branch& )является частной", которую, как я понимаю, не следует называть.

Оператор присваивания работает, так как если я заменю тело main ()на

branch a;
branch b;
b = a;

Он скомпилируется и запустится, как и ожидалось.

Это правильное поведение gcc? Если да, то что не так с приведенным выше кодом? Любое предложение полезно для меня. Благодарю вас!

-121 ---779501 ​​- Как остановить таймер после определенного количества раз Попытка использовать таймер для выполнения этого 4 раза с интервалом в 10 секунд каждый. Я попытался остановить его с помощью цикла, но он продолжает падать. Пробовали использовать расписание ()с тремя параметрами, но...

Попытка использовать Timerдля выполнения этого 4 раза с интервалом в 10 секунд каждый.

Я попытался остановить его с помощью цикла, но он продолжает падать. Пробовал использовать schedule()с тремя параметрами, но не знал, где реализовать переменную-счетчик. Любые идеи?

final Handler handler = new Handler(); 
Timer timer2 = new Timer(); 

TimerTask testing = new TimerTask() {
    public void run() { 
        handler.post(new Runnable() {
            public void run() {
                Toast.makeText(MainActivity.this, "test",
                    Toast.LENGTH_SHORT).show();

            }
        });
    }
}; 

int DELAY = 10000;
for (int i = 0; i != 2 ;i++) {
    timer2.schedule(testing, DELAY);
    timer2.cancel();
    timer2.purge();
}
8
задан Sufian 27 July 2016 в 07:37
поделиться