【发布时间】:2017-10-25 05:18:23
【问题描述】:
我的理解是函数作用域static constexpr 在编译时被评估。如果是这种情况,MSVC 对以下错误有什么理由(如果有):
int main()
{
int i = 5;
switch (i)
{
// Original question:
static constexpr int j = 7; // legal?
// My actual use case, which may not be legal.
static constexpr int k[2] = { 7, 4 };
default:
case 0:
break;
}
return 0;
}
testapp.cpp(10) : 错误 C2360 : 'j' 的初始化被 'case' 标签跳过
如果那是非 constexpr,那么是的,这是一个有效的投诉。然而,由于 constexpr 是在编译时评估的,因此不需要在声明站点执行任何操作。
-- 编辑--
向 Martin Bonner 道歉,他的回答因不适用于我原来的问题而被删除。
我的实际用例是第二个:带有初始化列表的 constexpr 数组。从我在引用的标准中看到的情况来看,我的第一个静态 constexpr scalar int 案例是不被禁止的。但是,看来我正在尝试做的事情是不正确的。
如果这确实是真的,那为什么? constexpr 的全部意义不是在编译时评估事物,因此,控制是否真正通过声明并不重要。
【问题讨论】:
-
fyi g++ 5.1.0 编译干净。
-
我会说这是一种非常奇怪的方式来编写 switch 语句。在它之外引入另一个范围来放置您的变量。
{static constexpr int j = 7; swtich(i){...}} -
constexpr 表示它在编译时是已知的,但除此之外,它的语义与任何其他变量相同(加上 const-ness)
-
@AndyG 当然,我可以在开关上方立即声明它,这是我目前所做的。但这是一个保持声明接近其使用的问题。正是出于这个原因,C++ 让我们能够在块中声明变量。我在 switch 中只在几个情况下使用了数组,所以我想尽可能地保持它的声明接近它的用途。
-
@DavidG:是的,这很公平。这是一个非常好的问题,让我研究了很多关于初始化和 switch 语句的规则,所以感谢你有机会发表答案。
标签: c++ function scope static constexpr