gpt4 book ai didi

c++ - 变量是大小为 1 的数组吗?

转载 作者:IT老高 更新时间:2023-10-28 22:35:39 26 4
gpt4 key购买 nike

考虑一下:

int main(int, char **) {
int variable = 21;
int array[1] = {21};
using ArrayOf1Int = int[1];
(*reinterpret_cast<ArrayOf1Int *>(&variable))[0] = 42;
*reinterpret_cast<int *>(&array) = 42;
return 0;
}

我是不是违反了the strict aliasing rule ?

或者,如 this comment这让我想到了这个问题:变量是大小为 1 的数组吗

请注意,我将此标记为语言律师问题。因此,我对 -fno-strict-aliasing 或编译器特定的行为不感兴趣,而是对标准中所说的内容感兴趣。此外,我认为了解 C++03、C++11、C++14 和更新版本之间是否以及如何发生变化会很有趣。

最佳答案

很明显,如果一个对象是一个大小为 1 的数组的变量,您可以用一个对象初始化对大小为 1 的数组的引用:

int variable{21};
int (&array)[1] = variable; // illegal

但是,初始化是非法的。与此相关的条款是第 1 段中所述的第 4 条 [conv](标准转换):

Standard conversions are implicit conversions with built-in meaning. Clause 4 enumerates the full set of such conversions.

这个子句太长了,不能在这里引用,但它并没有说明将对象转换为任何大小的数组的引用。同样,reinterpret_cast (5.2.10 [expr.reinterpret.cast]) 中的部分没有说明任何涉及数组的行为,但在第 1 段中说明了这种排除:

... Conversions that can be performed explicitly using reinterpret_cast are listed below. No other conversion can be performed explicitly using reinterpret_cast.

我不认为有一个明确的声明说一个对象不是一个对象的数组,但是有足够的遗漏来隐含地证明这个案例。标准关联对象和数组提供的保证是指向对象的指针表现得好像它们指向大小为 1 的数组(5.7 [expr.add] 第 4 段):

For the purposes of these operators, a pointer to a nonarray object behaves the same as a pointer to the first element of an array of length one with the type of the object as its element type.

这个语句的存在也意味着数组对象和非数组对象是不同的实体:如果它们被认为是相同的,那么这个语句就没有必要开始了。

关于标准的先前(或 future )版本:虽然不同条款中的确切词语可能已经改变,但总体情况并没有改变:对象和数组始终是不同的实体,到目前为止,我'我不知道有什么改变的意图。

关于c++ - 变量是大小为 1 的数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39401136/

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