Вы столкнулись с проблемой в
s1.name="Paolo";
, потому что в LHS вы используете тип array , который не является присваиваемым .
Для разработки из C11
главы §6.5.16
оператор присваивания должен иметь изменяемое значение lvalue в качестве его левого операнда.
blockquote >и относительно изменяемого lvalue , из главы §6.3.2.1
Модифицируемое lvalue является значением l, которое не имеет типа массива, [.. .]
blockquote>Вам нужно использовать
strcpy()
для копировать в массив.Тем не менее
data s1 = {"Paolo", "Rossi", 19};
работает нормально, потому что это не является прямым назначением , связанным с оператором присваивания. Там мы используем список инициализаторов , заключенный в скобки , чтобы обеспечить начальные значения объекта . Это следует за законом инициализации, как указано в главе §6.7.9Каждый список инициализаторов, заключенных в фигурную скобку, имеет связанный текущий объект. Когда нет обозначений, подобъекты текущего объекта инициализируются в соответствии с типом текущего объекта: элементы массива в возрастающем порядке индекса, члены структуры в порядке объявления и первый именованный член союза. [... .]
blockquote>
Это расширение GCC к стандарту: см. Здесь .
Вы можете использовать опцию -pedantic
, чтобы GCC выдал предупреждение, или -std = c ++ 98
, чтобы сделать ошибку, когда вы используете один из этих расширения (в случае, если переносимость вызывает беспокойство).
Вы используете функцию из C99, которая называется VLA (массивы переменной длины). Было бы лучше, если бы вы скомпилировали вашу программу так:
g++ -Wall -std=c++98 myprog.cpp