首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在数组上使用->算子

在数组上使用->算子
EN

Stack Overflow用户
提问于 2014-09-23 06:35:52
回答 4查看 86关注 0票数 3

我只是偶然发现了这个奇怪的语法。实际上,可以使用运算符-> on数组。

代码语言:javascript
运行
复制
struct Foo
{
    void bar() { }
};

int main()
{
    Foo foo[3] = { Foo(), Foo(), Foo() };
    foo->bar();
}

我以为操作符->只用于指向对象的指针,而在这段代码中我没有看到任何指针。即使有指针,它们也会因为临时的愚人而悬挂指针。是什么让这成为可能?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-09-23 06:40:49

数组可以衰减到指针,这些指针指向数组的第一个元素。例如,您可以这样做:

代码语言:javascript
运行
复制
void bar(int*) {}

int a[42] = {};
int* b = a;      // a decayed to int*, got assigned to b
bar(a);          // a decayed to int* to match bar parameter type

在您的示例中,当应用foo运算符时,foo会衰减到指向数组foo的第一个元素的指针。以下两项是相等的:

代码语言:javascript
运行
复制
foo->bar();
(&foo[0])->bar();

关于指向的对象的有效性,数组(如

代码语言:javascript
运行
复制
Foo foo[3];

始终包含3个默认初始化的Foo对象。您所做的是显式地初始化它们,但这不会改变任何事情。数组包含用于初始化其元素的对象的副本。

票数 5
EN

Stack Overflow用户

发布于 2014-09-23 06:44:16

您实际上可以在数组上使用operator->

是的,标准的数组到指针的转换意味着数组类型的表达式(如foo )可以衰减为指向第一个数组元素的指针,如果它用于预期指针的上下文中。

我以为操作符->只适用于指向对象的指针

它适用于可转换为对象指针(包括数组)的任何类型,也适用于重载的任何类类型。

即使有指针,它们也会因为Foo临时程序而悬挂指针。

不,foo不是临时的,它包含的元素也不是。您通过复制临时程序来初始化它们,但是数组中的副本与数组本身一样持久。

票数 3
EN

Stack Overflow用户

发布于 2014-09-23 06:41:22

我以为操作符->只用于指向对象的指针,而在这段代码中我没有看到任何指针。

数组在表达式中使用时会衰减为指针,就像您已经使用的那样。

即使有指针,它们也会因为临时的愚人而悬挂指针。是什么让这成为可能?

线

代码语言:javascript
运行
复制
 Foo foo[3] = { Foo(), Foo(), Foo() }

用三个有效的对象填充foo,而不是临时对象。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25988412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档