C++ 使用->;数组上的运算符

C++ 使用->;数组上的运算符,c++,C++,我只是偶然发现了这种奇怪的语法。实际上,您可以在数组上使用操作符-> struct Foo { void bar() { } }; int main() { Foo foo[3] = { Foo(), Foo(), Foo() }; foo->bar(); } 我以为操作符->只用于指向对象的指针,而我在这段代码中没有看到任何指针。即使有指针,它们也会因为Foo临时表而悬挂指针。什么使这成为可能?允许数组衰减为指针,这些指针指向数组的第一个元素。例如,您可以这样

我只是偶然发现了这种奇怪的语法。实际上,您可以在数组上使用操作符->

struct Foo
{
    void bar() { }
};

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

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

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

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->bar();
(&foo[0])->bar();
关于指向的对象的有效性,一个数组,如

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

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

数组在表达式中使用时会衰减为指针

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

线路

 Foo foo[3] = { Foo(), Foo(), Foo() }
用三个有效对象填充
foo
,而不是临时对象。

§4.2数组到指针转换[conv.Array]

1一个左值或右值类型为
N T数组
未知数组
T的边界可以转换为指向T的指针类型的右值。
结果是指向数组第一个元素的指针


您可以声明一个包含3个
Foo
实例的数组。通过使用
{Foo(),Foo(),Foo()}
创建3个实例来初始化数组,它们没有移动或复制到数组中的适当位置,实际上是在那里创建的,因此不存在临时对象

实际上,您可以在数组上使用
操作符->

struct Foo
{
    void bar() { }
};

int main()
{
    Foo foo[3] = { Foo(), Foo(), Foo() };
    foo->bar();
}
是的,标准数组到指针转换意味着数组类型的表达式,如
foo
,如果在需要指针的上下文中使用,则可以衰减为指向第一个数组元素的指针

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

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

即使有指针,它们也会因为
Foo
temporaries而挂起指针


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

foo
衰减为指向其第一个元素的指针。这指向一个有效的对象。代码中没有悬空的指针。