Эта проблема основана на коде, который работает у меня на 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
поддерживает эту подпись конструкции. Проблема связана с функциями специальных членов.
T
конструируется по умолчанию). MyBase
получит автоматически определяемый конструктор копирования (пока T
является копируемым), который будет направлять конструирование копирования T
. Итак, если я передам MyBase
в качестве единственного аргумента конструктора, какой конструктор будет вызван, перенаправляющий или неявное копирование?
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 из-за возникновения конфликта?