jac*_*k X 5 c++ language-lawyer implementation-defined-behavior
[conv.fpint] p2 说
\n\n\n如果要转换的值在可以表示的值范围内,但无法准确表示该值,则它是下一个较低或较高可表示值的实现定义选择。
\n
[intro.abstract] p2 说
\n\n\n抽象机的某些方面和操作在本文档中被描述为实现定义的(例如,
\nsizeof(int))。这些构成了抽象机的参数。每个实现都应包括描述其在这些方面的特征和行为的文档。此类文档应定义与该实现相对应的抽象机的实例(下面称为\xe2\x80\x9c对应实例\xe2\x80\x9d)。
[intro.abstract] p5 说
\n\n\n执行格式良好的程序的一致实现应产生与具有相同程序和相同输入的抽象机的相应实例的可能执行之一相同的可观察行为。但是,如果任何此类执行包含未定义的操作,则本文档对使用该输入执行该程序的实现没有任何要求(甚至不涉及第一个未定义操作之前的操作)。
\n
考虑有一个实现,它不能16777217准确地表示 float 类型的对象中的值,并且这样的值的选择可以是16777216或者16777218。对于转换评估的所有奇数次,它选择较低的可表示值,对于转换评估的所有偶数次,它选择较高的可表示值。这是一个符合要求的实施吗?
float a1 = 16777217; // 16777216\nfloat a2 = 16777217; // 16777218\n.\n.\n.\nfloat a<2n-1> = 16777217; // 16777216\nfloat a<2n> = 16777217; // 16777218\nRun Code Online (Sandbox Code Playgroud)\n类似案例:
\nsizeof(int); // 4\nsizeof(int); // 8\n.\n.\n.\nsizeof(int); // 4\nsizeof(int); // 8\nRun Code Online (Sandbox Code Playgroud)\n对于所有奇数次的评估sizeof(int),结果都是全部4,对于所有偶数次的评估sizeof(int),结果都是全部8。
从技术上来说,是的。您已经引用了相关文本,因此我的回答将不再包含任何进一步的引用。 实现定义意味着实现必须记录它实现的行为。
除了您引用的文本中指定的行为之外,没有对行为的进一步限制。实施是否记录单一结果或一系列结果以及在什么情况下记录等,这将是一个实施质量问题。