看看这段代码:
#include <string>
#include <iostream>
using namespace std;
template <typename T, const T& temp>
void g()
{
cout << temp << endl;
}
static const std::string s = "abc";
int main() {
g<string, s>();
}
Run Code Online (Sandbox Code Playgroud)
当我使用Visual C++ 2013 11月CTP编译时,我得到:
"错误C2970:'g':模板参数'temp':'s':涉及具有内部链接的对象的表达式不能用作非类型参数"
但是,我在C++ 14标准(14.3.2 [temp.arg.nontype])中阅读了以下内容:
"一个常量表达式(5.19),用于指定具有静态存储持续时间和外部或内部链接的完整对象的地址或"
我将其解释为"具有静态存储持续时间和外部链接的常量表达式"或"具有静态存储持续时间和内部链接的常量表达式".在上面的例子中,变量是不是"具有静态存储持续时间和内部链接的常量表达式"?
当我将s更改为:
std :: string s ="abc";
然后它编译并且它起作用,但不是违反标准的,因为现在s不再是"常量表达式".
有人可以对此有所了解吗?我在这里误解了什么吗?