存储数组的地方,如果我在返回后声明它
Where stored array, if I declared it after return?
我有代码C++11:
template<std::size_t n>
static inline constexpr uint32_t mask() noexcept
{
static_assert(n <= 32, "!");
using list = uint32_t[];
return list{
0x0u,
0x1u, 0x3u, 0x7, 0xfu, 0x1fu, 0x3fu, 0x7fu, 0xffu,
0x1ffu, 0x3ffu, 0x7ffu, 0xfffu, 0x1fffu, 0x3fffu, 0x7fffu, 0xffffu,
0x1ffffu, 0x3ffffu, 0x7ffffu, 0xfffffu, 0x1fffffu, 0x3fffffu, 0x7fffffu, 0xffffffu,
0x1ffffffu, 0x3ffffffu, 0x7ffffffu, 0xfffffffu, 0x1fffffffu, 0x3fffffffu, 0x7fffffffu, 0xffffffffu
} [ n ];
}
问:阵列list
存储在哪里? (在静态内存中,自动内存中,还是无处存储)?
在正常函数中,它将是一个临时的,存储在自动内存中。由于n
是一个编译时常量,因此可以优化它以简单地返回值,删除数组。
但是,这是constexpr
的,因此应在编译时计算返回值。数组在运行时根本不应该存在。
由于函数中的n
不能是变量,例如
size_t n;
std::cin >> n;
std::cout << mask<n>() << std::endl;
将编译失败,因为n
在编译时不是常量,编译器根本不需要存储数组。通常,constexpr
函数不应生成除某种常量值之外的任何"代码"。
我的编译器似乎不接受这里发布的代码 - 可能是因为它现在有点古老(它是一个 gcc 4.6.3 - 我也尝试过 clang++,但它失败了,因为它尝试使用 4.6.3 标头,这显然不是"叮当味")。
当然,写这个要容易得多:
template<std::size_t n>
inline constexpr uint32_t mask() noexcept
{
static_assert(n <= 32, "!");
return (1u << n) -1;
}
为了应对 n == 32 的特殊情况(并避免 UB,尽管在大多数架构中,上述方法可能会做正确的事情):
template<>
inline constexpr uint32_t mask<32>() noexcept
{
return ~0;
}
相关文章:
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 当返回类型声明为 ListNode 时,我们是否可以返回 false<T>*
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- 如何在方法主体中返回声明向量的引用?
- 如何声明接受字符串、返回void的闭包的类型
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- 尽管显式声明了返回类型,但对lambda的调用是不明确的
- 由于值返回函数中的错误,程序无法编译.它说未声明的标识符
- 内存浪费?如果main()应该只返回0或1,那么为什么main是用int而不是短int甚至char声明的
- 为什么从函数返回数组时需要将数组声明为静态数组.(C++)
- 为什么此函数返回一个link_type但它被声明为迭代器
- 如果使用返回引用的函数初始化"auto"var,为什么它不声明引用类型?
- 和返回C++中的声明
- 如何声明接受转发引用并返回引用或副本的函数模板
- 从模板方法返回在模板类中声明的结构
- 返回类型布尔函数中的声明语法错误
- "Vector subscript out of range",在返回声明?
- const 在具有尾随返回类型的自动退货声明中是什么意思
- C++:在原型中声明"auto"函数返回类型仍然会导致在扣除错误之前使用"auto&quo