Рассмотрим следующую программу:Move семантика в присутствии оснований виртуальных
#include <iostream>
#include <ostream>
#include <string>
#include <utility>
using namespace std;
struct Name { string s; Name(string s) : s(move(s)) { } };
struct A : virtual Name { A(string s) : Name(move(s)) { } };
struct B : virtual Name { B(string s) : Name(move(s)) { } };
struct C : A, B { C(string s) : A(string()), B(string()), Name(move(s)) { } };
C f() { return C("abcdefghijklmnopqrstuvwxyz"); }
int main()
{
C c1("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
C c2("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
C ff = f();
c1 = f();
c2 = ff;
cout << "C1 = " << c1.s << " " << "C2 = " << c2.s << "\n";
return 0;
}
GCC (4.9.2) (http://ideone.com/G7uzCQ) и лязг ++ и печатать различные значения для C1 и C2, тогда как Visual Studio 2013 и 2015 последовательно печати последовательность алфавитов в нижнем регистре как для C1, так и для C2.
Кто такой? или это просто какая-то петля в стандарте?
Полезное предупреждение от clang: оператор присваивания по умолчанию с 'C' переместит присвоение виртуального базового класса' Name' несколько раз – 0x499602D2
@ 0x499602D2 мой вопрос по-прежнему остается :-) Кто прав? или нет правильного ответа? – ForeverLearning
Похож на UB. 'c1 = f()' переходит из временного, созданного 'f()' дважды. – 0x499602D2