我只是偶然发现了这个奇怪的语法。实际上,可以使用运算符-> on数组。
struct Foo
{
void bar() { }
};
int main()
{
Foo foo[3] = { Foo(), Foo(), Foo() };
foo->bar();
}我以为操作符->只用于指向对象的指针,而在这段代码中我没有看到任何指针。即使有指针,它们也会因为临时的愚人而悬挂指针。是什么让这成为可能?
发布于 2014-09-23 06:40:49
数组可以衰减到指针,这些指针指向数组的第一个元素。例如,您可以这样做:
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的第一个元素的指针。以下两项是相等的:
foo->bar();
(&foo[0])->bar();关于指向的对象的有效性,数组(如
Foo foo[3];始终包含3个默认初始化的Foo对象。您所做的是显式地初始化它们,但这不会改变任何事情。数组包含用于初始化其元素的对象的副本。
发布于 2014-09-23 06:44:16
您实际上可以在数组上使用
operator->。
是的,标准的数组到指针的转换意味着数组类型的表达式(如foo )可以衰减为指向第一个数组元素的指针,如果它用于预期指针的上下文中。
我以为操作符->只适用于指向对象的指针
它适用于可转换为对象指针(包括数组)的任何类型,也适用于重载的任何类类型。
即使有指针,它们也会因为
Foo临时程序而悬挂指针。
不,foo不是临时的,它包含的元素也不是。您通过复制临时程序来初始化它们,但是数组中的副本与数组本身一样持久。
发布于 2014-09-23 06:41:22
我以为操作符->只用于指向对象的指针,而在这段代码中我没有看到任何指针。
数组在表达式中使用时会衰减为指针,就像您已经使用的那样。
即使有指针,它们也会因为临时的愚人而悬挂指针。是什么让这成为可能?
线
Foo foo[3] = { Foo(), Foo(), Foo() }用三个有效的对象填充foo,而不是临时对象。
https://stackoverflow.com/questions/25988412
复制相似问题