Строковый литерал имеет тип const char[N]
, его содержимое нельзя изменять .Возможность неявного преобразования строковых литералов в char*
была когда-либо существовала только в C ++ для обратной совместимости с C. Это очень опасная вещь, она устарела практически навсегда и была окончательно удалена в C ++ 11.Visual Studio 2017 переключил стандарт языка по умолчанию на C ++ 14, что, скорее всего, стало причиной того, что ваш код перестал работать там.Если вы абсолютно точно уверены, что указанная строка не будет изменена, тогда вы можете использовать const_cast
MENUITEMINFO mii = { 0 };
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_TYPE;
mii.fType = MFT_STRING;
mii.dwTypeData = const_cast<char*>("item 1");
В идеале вы должны просто использовать const char*
, новзаимодействие с некоторыми старыми API C, к сожалению, иногда требует использования const_cast
.Прежде чем делать подобные вещи, всегда проверяйте документацию API, чтобы убедиться, что API не будет пытаться изменить содержимое строки.
В случае с MENUITEMINFO
здесь,Причина, по которой dwTypeData
является char*
, а не const char*
, наиболее вероятно, что структура предназначена для использования с GetMenuItemInfo
и SetMenuItemInfo
, где первый ожидает указатель на буфер, в котором он будетнаписать строку, в то время как последний ожидает указатель на буфер, из которого он будет читать строку…