C++11 error: use of deleted function
От: Elija  
Дата: 07.04.16 10:35
Оценка:
У меня два компилятора:
g++ (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4
Microsoft Visual Studio 2015 ver. 14.0. (Visual C++ 2015)

Просто код для примера:

#include <queue>

class C
{
};


class B
{
public:
  // assignment and copy prohibited
  B(const B&) = delete;
  B& operator=(const B&) = delete;

  B(int v1, int v2) : m_V1(v1), m_V2(v2) {}

private:
  int m_V1;
  int m_V2;
  std::queue<C> m_Queue;
};

class A
{
public:
  // assignment and copy prohibited
  A(const A&) = delete;
  A& operator=(const A&) = delete;

  A(int p1, int p2) : arrB{ {p1+1, p2+2}, {p1+3, p2+4}, {p1+5, p2+6} } { }

private:
  B arrB[3];
};


1) Если я использую g++ и

std::queue<C> m_Queue;


то я получаю следующую ошибку:

make
g++ -std=c++11 -c test.cpp
test.cpp: In constructor ‘A::A(int, int)’:
test.cpp:29:70: error: use of deleted function ‘B::B(const B&)’
   A(int p1, int p2) : arrB{ {p1+1, p2+2}, {p1+3, p2+4}, {p1+5, p2+6} } { }
                                                                      ^
test.cpp:11:3: error: declared here
   B(const B&) = delete;
   ^
make: *** [test.o] Error 1


2) Если же я использую тот же g++, но комментирую линию кода

//std::queue<C> m_Queue;


или если я использую оба варианта (раскомментировано и закомментировано) с Microsoft Visual Studio 2015, то я не получаю никаких ошибок.

3) Как я понимаю, инициализация списком использует или direct-list-initialization или copy-list-initialization.

8.5.4 List-initialization
1 List-initialization is initialization of an object or reference from a braced-init-list. Such an initializer is called an initializer list, and the comma-separated initializer-clauses of the list are called the elements of the initializer list. An initializer list may be empty. List-initialization can occur in direct-initialization or copyinitialization contexts; list-initialization in a direct-initialization context is called direct-list-initialization and list-initialization in a copy-initialization context is called copy-list-initialization.

Но, видимо, я не понимаю какой из видов инициализации будет использован в моём случае. Я предполагал, что должна использоваться direct-list-initialization в соответствии с http://en.cppreference.com/w/cpp/language/list_initialization (вариант (5) по этой ссылке, вариант (9) — не то, поскольку это "a user-defined operator[]"). Но тогда причём тут недоступный конструктор копирования? И какая связь с наличием экземпляра очереди в классе?

Может мне кто-то подробно объяснить эту ситуацию и в чём я ошибаюсь и какой компилятор прав?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.