Есть ли в C ++ удобный конструктор?

Возможно ли, чтобы перегруженный конструктор каким-либо образом вызвал другой конструктор внутри класса, как показано в приведенном ниже коде?

class A {
public:
    A(std::string str) : m_str(str) {}
    A(int i) { *this = std::move(A(std::to_string(i))); }

    std::string m_str;
};

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

Если да, не могли бы вы объяснить, почему, а также предложить лучшую альтернативу?


person Makaronodentro    schedule 08.02.2017    source источник
comment
Термин, который вам нужен, - это конструкторы-делегаты.   -  person nwp    schedule 08.02.2017
comment
Почему не A(int i) : m_str(std::to_string(i)) {}?   -  person Cory Kramer    schedule 08.02.2017
comment
Это минимальный пример. Я хочу перегрузить конструктор, который принимает 7 параметров, 4 из которых имеют значения по умолчанию, и я хочу избежать явной установки значений по умолчанию более чем в одном месте.   -  person Makaronodentro    schedule 08.02.2017
comment
@Makaronodentro: Но вам все равно нужно дважды указать значения по умолчанию, не так ли?   -  person Lightness Races in Orbit    schedule 08.02.2017
comment
@LightnessRacesinOrbit no, со значениями по умолчанию: A (std :: string str1, str :: string str2 = abc): m_str1 (str1), m_str2 (str2) {} делегирование: A (int i): A (std :: move ( std :: to_string (i))) {}   -  person Makaronodentro    schedule 08.02.2017
comment
std::move(std::to_string(i)) Этот ход лишний. std::to_string(i) уже является rзначением. Напомним, что std::move на самом деле не выполняет ход   -  person Lightness Races in Orbit    schedule 08.02.2017


Ответы (1)


В C ++ 11 представлены делегирующие конструкторы:

class A
    {
    public:
    std::string m_str;
    A(std::string str) : m_str(str) {} // target constructor
    A(int i) : A(std::to_string(i)) {} // delegating constructor
    };
person acraig5075    schedule 08.02.2017
comment
Может, стоит m_str(std::move(str)). - person juanchopanza; 08.02.2017
comment
Возможно, стоит отметить, что целевой конструктор вызывается перед конструктором делегирования, поэтому в теле последнего вы можете предположить, что первый был вызван. - person Martin Véronneau; 08.02.2017