具有指针数据类型的非类型函数模板参数
Non type function template parameter with pointer data type
我正在使用模板概念学习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()来检查它们是否相同。如果使用==,则只是比较地址,当模板在不同的翻译单位。
其他更简单的内置类型,如文字,也是内部链接(它们没有标识符,无法从不同的翻译单元)。然而,它们的比较微不足道,因为它是按价值计算的。因此,它们可以用于模板。
相关文章:
- 仅在函数模板中为那些定义了函数的类型执行函数
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- 函数模板返回类型
- 特定类型的模板函数的专用化
- 在实例化之前推断函数模板的返回类型
- 函数模板签名中忽略的成员类型def 的访问说明符
- 实例化多种类型的成员函数模板
- 使用函数模板推导返回类型
- 重载模板<类型名...>类的函数模板
- 将函数类型作为模板参数传递不会编译
- 专用于类型集的函数模板
- async中没有匹配的函数(模板中未解析的类型)
- 在C++17中,为什么类模板和函数模板的指针类型推导明显不一致
- 为什么重载的函数模板顺序对基本类型很重要
- 没有函数模板的实例"max"与参数列表参数类型匹配(int、int)
- 模板函数重载(泛型类型与模板模板类型)选择正确的重载
- 如何在返回类型函数模板的专用化中使用派生类型?( "couldn't infer template argument" )
- 具有指针数据类型的非类型函数模板参数
- C++模板基类的非类型函数模板的 using 声明
- 非类型函数模板参数