使用 std::extent 获取数组的第二维

Har*_*rry 5 c++

我正在尝试使用 获取二维数组的第二维std::extent,但将输出作为0.

#include <iostream>
#include <type_traits>


int32_t main(int32_t argc, char *argv[]) {
    int32_t arr[10][100];
    
    std::cout << "first dim: " << sizeof(arr) / sizeof(*arr) << std::endl;
    std::cout << "second dim: " << sizeof(*arr) / sizeof(**arr) << std::endl;
    
    std::cout << "rank: " << std::rank<decltype(arr)>{} << std::endl;
    std::cout << "first dim: " << std::extent<decltype(arr)>{} << std::endl;
    std::cout << "second dim: " << std::extent<decltype(*arr)>{} << std::endl;
    
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

cig*_*ien 6

您得到结果的原因0decltype(*arr)具有 type int32_t(&)[100],它是对数组类型的引用std::extent退货0,除非你通过它正是数组类型。

您可以通过删除这样的引用来获得预期的结果:

std::extent<std::remove_reference_t<decltype(*arr)>>{}  // 100
Run Code Online (Sandbox Code Playgroud)

这是一个演示

  • 仅支持 c++11 标准的编译器可以使用 `std::extent&lt;std::remove_reference&lt;decltype(*arr)&gt;::type&gt;{}` (2认同)

for*_*818 5

要获得第二维,请使用以下命令:

std::cout << "second dim: " << std::extent<decltype(arr),1>{} << std::endl; 
                                                   //    ^ second dimension !
Run Code Online (Sandbox Code Playgroud)

  • 我必须承认我不明白为什么原版不起作用。只是认为这是一个比评论更好的答案 (2认同)