具有指针数据类型的非类型函数模板参数

Non type function template parameter with pointer data type

本文关键字:类型 函数模板 参数 指针 数据类型      更新时间:2023-10-16

我正在使用模板概念学习c++中的元编程。

我有以下问题。

我理解什么

1) INTEGER可以用作非类型模板参数。

template <typename T, int VALUE>
T addBoth(T const & a)
{
   return VALUE + a;
}

我理解上面的概念。

我不明白什么

2)

template <typename T, char *name>
class Test .....

Test<10, "StackOverflow"> sTest;
Reason: String literals are objects with internal linkage. 

我不明白以上第二点。

有人能详细说明一下吗?

所以这个问题应该有你需要的所有信息,但这里有一个摘要。

OP文本中使用的报价:

因为字符串文字是具有内部链接的对象(两个字符串具有相同值但在不同模块中的文字是不同的对象),也不能将它们用作模板参数。

托尼解释了你为什么不能这么做。

代码示例:

#include <iostream>
template <const char* P> void f() { std::cout << P << 'n'; }
int main() {
    f<"hello there">();
}

推理:

因为"你好"并不能100%保证能解析为单个可用于实例化模板一次的整数值(尽管大多数优秀的链接者都会尝试将所有用法折叠起来链接的对象,并使用字符串)。

Mikael阐述:

显然,像"foobar"这样的字符串文字与其他文字不同内置类型(如int或float)。他们需要有一个地址(const char*)。地址实际上是编译器替换文字出现的位置。那个地址指向程序的某个位置,在编译时固定记忆力

因此,它必须具有内部联系。内部联动装置只是意味着不能跨翻译单元链接(编译cpp文件)。编译器可以尝试执行此操作,但不是必需的。换句话说,内部链接意味着,如果您将两个相同的文字字符串(即const char*的值)翻译为)在不同的cpp文件中,它们将不相同,在全体的

您不能将它们用作模板参数,因为它们需要strcmp()来检查它们是否相同。如果使用==,则只是比较地址,当模板在不同的翻译单位。

其他更简单的内置类型,如文字,也是内部链接(它们没有标识符,无法从不同的翻译单元)。然而,它们的比较微不足道,因为它是按价值计算的。因此,它们可以用于模板。