Я создал следующий пример, который компилируется в 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";
}
Я был бы признателен за любую подсказку относительно этого образца.