【问题标题】:C++11 about *begin(a)C++11 关于 *begin(a)
【发布时间】:2022-01-16 06:18:41
【问题描述】:
#include<iterator>
#include<iostream>

int a[5][4];

int main()
{
    cout << *begin(a);
}

为什么cout 的打印结果与begin(a) 相同?

似乎* 没有取消引用begin(a) 返回的指针?

谁能告诉我为什么?

【问题讨论】:

  • 这看起来不像是编译 C++。

标签: c++ arrays c++11


【解决方案1】:

这里* 只影响指针的类型,而不影响它的数值。

std::begin(a) 返回指向a 的第一个元素的指针,类型为int (*)[4](指向4 个整数数组的指针)。

*std::begin(a) 返回int[4]。由于cout 不能直接打印数组,因此数组会衰减到指向其第一个元素的指针,类型为int *,并按原样打印。

**std::begin(a) 将返回 int

【讨论】:

    【解决方案2】:

    你有一个二维数组

    int a[5][4];
    

    其元素依次为 int[4] 类型的一维数组。

    表达式*begin( a ) 产生对int ( &amp; )[4] 类型数组的第一个元素的引用。本语句中使用

     cout << *begin(a);
    

    表达式被隐式转换为指向其第一个 int * 类型元素的指针,等效于 &amp;a[0][0]

    另一方面,表达式begin( a ) 的类型为int ( * )[4]

    整个二维数组的地址与其第一个元素的地址一致,一维数组又与一维数组的第一个元素的地址一致。虽然使用的表达式有不同的类型。

    【讨论】:

    • 强制“表达式不能有引用类型”。 :P
    • @HolyBlackCat 该评论与我的回答毫无共同之处。
    • *begin( a ) 是一个表达式,因此不能有int ( &amp; )[4] 类型。它是int[4] 类型的左值。
    • @HolyBlackCat 在我的回答中写到该表达式产生一个引用。
    • 我知道吗?我认为事实并非如此。见eel.is/c++draft/expr.sub#2
    猜你喜欢
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 2018-10-11
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    相关资源
    最近更新 更多