Конфликт между конструктором копирования и конструктором пересылки

Эта проблема основана на коде, который работает у меня на GCC-4.6, но не на другом пользователе с CLang-3.0, оба в режиме C ++ 0x.

template <typename T>
struct MyBase
{
//protected:
    T  m;

    template <typename Args...>
    MyBase( Args&& ...x ) : m( std::forward<Args>(x)... ) {}
};

Объект MyBase может принимать любой список аргументов конструктора, если T поддерживает эту подпись конструкции. Проблема связана с функциями специальных членов.

  1. IIUC, шаблон конструктора отменяет автоматически определенный конструктор по умолчанию. Однако, поскольку шаблон может принимать нулевые аргументы, он будет действовать как явно определенный конструктор по умолчанию (пока T конструируется по умолчанию).
  2. IIUC, определение политики создания копии класса игнорирует шаблоны конструкторов. В данном случае это означает, что MyBase получит автоматически определяемый конструктор копирования (пока T является копируемым), который будет направлять конструирование копирования T .
  3. Примените предыдущий шаг также для построения ходов.

Итак, если я передам MyBase const & в качестве единственного аргумента конструктора, какой конструктор будет вызван, перенаправляющий или неявное копирование?

typedef std::vector<Int>  int_vector;
typedef MyBase<int_vector>   VB_type;

int_vector  a{ 1, 3, 5 };
VB_type     b{ a };
VB_type     c{ b };  // which constructor gets called

Моя пользовательская проблема заключалась в использовании этого в как базовый класс. Компилятор жаловался, что его класс не может синтезировать автоматически определенный конструктор копии, потому что он не может найти совпадение с шаблоном конструктора базового класса.Разве он не должен вызывать автоматический конструктор копирования MyBase для своего собственного конструктора автоматического копирования? Ошибка CLang из-за возникновения конфликта?

11
задан CTMacUser 15 February 2012 в 02:51
поделиться