gpt4 book ai didi

c++ - 模板非类型参数?

转载 作者:可可西里 更新时间:2023-11-01 17:10:22 26 4
gpt4 key购买 nike

看这段代码:

#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>();
}

当我使用 Visual C++ 2013 November CTP 编译它时,我得到:

“错误 C2970:‘g’:模板参数‘temp’:‘s’:涉及具有内部链接的对象的表达式不能用作非类型参数”

但是,我在 C++ 14 标准 (14.3.2 [temp.arg.nontype]) 中阅读了以下内容:

“一个常量表达式 (5.19),指定具有静态存储持续时间和外部或内部链接的完整对象的地址,或者”

我将其解释为“具有静态存储持续时间和外部链接的常量表达式”或“具有静态存储持续时间和内部链接的常量表达式”。在我上面的示例中,变量 s 不是“具有静态存储持续时间和内部链接的常量表达式”吗?

当我将 s 更改为:

std::string s = "abc";

然后它编译并运行,但这并不违反标准,因为现在 s 不再是“常量表达式”。

有人可以阐明这一点吗?我在这里误解了什么吗?

最佳答案

static替换为extern:

extern const std::string s = "abc";

原因是在 C++98/C++03 中,带有内部链接的引用不允许作为模板参数。

另请注意,如果const删除static工作在那里,因为在 namespace 级别声明的 const 对象具有 internal 链接(除非声明为 extern)。所以你需要使用 extern ,如上所示。

关于c++ - 模板非类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24271605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com