模板编译错误 - 标准与否?

Luc*_*ore 5 c++ templates

我有以下代码:

template<int k>
void foo()
{
}
int main(int argc, char* argv[])
{
    int k = 1000;
    foo<k>();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

哪个不编译,但如果我声明kconst,它确实:

template<int k>
void foo()
{
}
int main(int argc, char* argv[])
{
    const int k = 1000;
    foo<k>();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,我看到了为什么在第一种情况下它不能编译而在第二种情况下它的原因,但这是由标准指定的吗?

我得到的错误是:

Error   1   error C2971: 'foo' : template parameter 'k' : 'k' : a local variable cannot be used as a non-type argument
Run Code Online (Sandbox Code Playgroud)

这是不完全清楚的,因为它k是一个局部变量,在它的情​​况下const......对吗?

GMa*_*ckG 2

\xc2\xa714.3.2.1 说[删节]:

\n\n
\n

非类型、非模板模板参数的模板参数应为以下之一:
\n \xe2\x80\x94 整型常量表达式整型或枚举类型的

\n
\n\n

\xc2\xa75.19.1 说[删节,强调我的]:

\n\n
\n

整型常量表达式只能涉及用常量表达式初始化的整型或枚举类型的文字、枚举器、const 变量或静态数据成员...

\n
\n\n

你的第二个定义k满足这一点,因此允许将其用作模板参数的 ICE。

\n\n

该错误有点误导,因为“局部变量不能用作非类型参数”一般来说是正确的,但在某些限制下它完全没问题。

\n