gpt4 book ai didi

c++ - 是否每个 "normal"使用用户定义的文字都会导致未定义的行为?

转载 作者:行者123 更新时间:2023-12-03 10:39:00 25 4
gpt4 key购买 nike

用户定义的文字必须以下划线开头。

这是一个或多或少众所周知的规则,您可以在每个谈论用户文字的外行词站点上找到。自从“胡说八道”以来,我(甚至可能是其他人)就一直公然无视这条规则。当然,现在这绝对是不正确的。从最严格的意义上讲,它使用保留的标识符,从而调用未定义的行为(尽管实际上,编译器不会给您带来太多的耸耸肩的感觉)。

因此,考虑是否应该继续故意忽略该标准的那部分(我认为无用),我决定查看实际编写的内容。因为,每个人都知道,这有什么关系。重要的是标准中写的内容。
[over.literal]声明保留了“一些”文字后缀标识符,并链接到[usrlit.suffix]。后者指出保留所有的,但以下划线开头的除外。好的,这几乎就是我们已经知道的,明确编写的(或者相反编写的)。

另外,[over.literal]包含一个Note,它暗示了一个显而易见但令人不安的事情:

except for the constraints described above, they are ordinary namespace-scope functions and function templates



好吧,可以肯定的是。它无处表明它们不是,所以您还希望它们成为什么。

但请稍等。 [lex.name]明确声明,保留全局命名空间
中以下划线 开头的每个标识符。

现在,通常是文字运算符,除非您将其显式地放入一个命名空间(我相信没有人这样做!?)在全局命名空间中非常多。因此,必须保留下划线开头的名称。没有提及特殊异常(exception)。因此,每个名称(带下划线或不带下划线)都是保留名称。

您是否确实希望将用户定义的文字放到命名空间中,因为“常规”用法(是否带有下划线)使用的是保留名称?

最佳答案

是:禁止将_用作全局标识符的开始,再加上要求以_开头的非标准UDL,这意味着您不能将它们放在全局 namespace 中。但是,您不应该用东西(尤其是UDL)来弄脏全局 namespace ,所以这不是什么大问题。

标准使用的传统习惯用法是将UDL放在literals命名空间中(如果您有不同的UDL集,则将它们放在该命名空间下的不同inline namespaces中)。该literals命名空间通常位于您的主要命名空间之下。当您要使用一组特定的UDL时,可以调用using namespace my_namespace::literals或包含您所选择的文字集的任何子命名空间。

这很重要,因为UDL经常被严重缩写。例如,标准使用s表示std::string,还使用ozt_code表示秒。尽管它们确实适用于不同种类的文字(应用于字符串的std::chrono::duration是字符串,而应用于数字的s是持续时间),但有时阅读使用缩写文字的代码可能会造成混淆。因此,您不应该对库的所有用户都使用文字。他们应该选择使用它们。

通过为这些 namespace 使用不同的 namespace (sstd::literals::string_literals),用户可以预先了解他们希望在代码的哪些部分中使用哪些文字集。

关于c++ - 是否每个 "normal"使用用户定义的文字都会导致未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59180353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com