Безопасен ли код? Может возникнуть соблазн написать код, похожий на это:
#include <map>
const std::map<const char*, int> m = {
{"text1", 1},
{"text2", 2}
};
int main () {
volatile const auto a = m.at("text1");
return 0;
}
Карта предназначена для использования только со строковыми литералами.
Я думаю, что это совершенно законно и, кажется, работает, однако я никогда не видел гарантии, что указатель на литерал, используемый в двух разных местах, будет таким же. Мне не удалось заставить компилятор сгенерировать два отдельных указателя для литералов с одним и тем же контентом, поэтому я начал задаваться вопросом, насколько твердо это предположение.
Меня интересует только то, имеют ли литералы с одним контентом разные указатели. Или более формально, может ли код выше, кроме?
Я знаю, что есть способ написать код, чтобы убедиться, что он работает, и я думаю, что выше подход опасен, потому что компилятор может решить назначить два разных хранилища для литерала, особенно если они помещены в разные единицы перевода. Я прав?