【发布时间】:2019-02-24 16:32:57
【问题描述】:
下面的代码安全吗?编写类似这样的代码可能很诱人:
#include <map>
const std::map<const char*, int> m = {
{"text1", 1},
{"text2", 2}
};
int main () {
volatile const auto a = m.at("text1");
return 0;
}
该映射仅用于字符串字面量。
我认为这是完全合法的并且似乎可以正常工作,但是我从未见过保证在两个不同地方使用的文字指针相同。我无法让编译器为具有相同内容的文字生成两个单独的指针,所以我开始怀疑这个假设有多可靠。
我只对具有相同内容的文字是否可以有不同的指针感兴趣。或者更正式地说,上面的代码可以除外吗?
我知道有一种方法可以编写代码以确保其正常工作,并且我认为上述方法很危险,因为编译器可能会决定为文字分配两个不同的存储空间,尤其是当它们被放置在不同的翻译单元中时。我说的对吗?
【问题讨论】:
-
“但是我从来没有看到保证在两个不同的地方使用的字面量的指针是相同的” - 这是一个很好的理由
-
为什么不使用
std::string? -
@tkausl 因为这超出了明确提到的问题范围。我知道如何正确地写它。另外,因为
std::stringctor 不是constexpr。 -
@StoryTeller 这是在开玩笑。请分享!
-
@luk32 作为旁注,您的代码是完全合法的,它可能无法达到您的预期(即,
std::terminate可能由于未捕获的异常而被调用)。
标签: c++ storage language-lawyer string-literals