MSVC создает код, в то время как g ++ и clang терпят неудачу с неоднозначным оператором = ошибка - PullRequest
0 голосов
/ 08 октября 2018

Я создал следующий пример, который компилируется в MSVC (2015, 2017), в то время как он не работает на g ++ и clang.Хотя я знаю, как обойти проблему (использовать явное приведение вместо неявного), я хочу узнать, какой компилятор ближе к стандарту в отношении этого образца?

#include <iostream>
#include <string>

struct A {
    std::string a;
};

struct B {
    std::string b1;
    std::string b2;
};

struct C {
    int c;
};

class test
{
public:
    std::string t_a;
    std::string t_b1;
    std::string t_b2;
    int t_c;

    template <class ValueT>
    operator ValueT() const
    {
        ValueT tmp;
        get_values(*this, tmp);
        return  tmp;
    };
};

void get_values(const test& t1, A& a)
{
    a.a = t1.t_a;
};

void get_values(const test& t1, B& b)
{
    b.b1 = t1.t_b1;
    b.b2 = t1.t_b2;    
};

void get_values(const test& t1, C& c)
{
    c.c = t1.t_c;
};

template<class Base1, class Base2>
class Mixin : public Base1, public Base2
{
public:
    virtual Mixin& operator= (const Base1& p) { Base1::operator=(p); return     *this; }
    virtual Mixin& operator= (const Base2& p) { Base2::operator=(p); return *this; }

    virtual void merge(const Base1& p1, const Base2& p2) {
        *this = p1;
        *this = p2;
    }
};

template<class Base1, class Base2>
void get_values(const test& j, Mixin<Base1, Base2>& p)
{
    Base1 b1 = j;
    Base2 b2 = j;
    p.merge(b1, b2);
}

using mixed = Mixin<A, Mixin<B,C>>;

int main() 
{
    test tt {
        "123",
        "456",
        "789",
        10
    };

    mixed m{};
    m = tt;

    std::cout << m.a << " " << m.c << "\n";
}

Я был бы признателен за любую подсказку относительно этого образца.

...