字符串作为模板参数
Strings as template arguments
虽然c++标准不允许使用字符串字量作为模板参数,但允许这样做:
ISO/IEC 14882:2011
14.3.2模板非类型参数[temp.arg.nontype]
2[注意:字符串字面值(2.14.5)不满足要求这些类别中的任何一个,因此都是不可接受的模板参数。[示例:
template<class T, const char* p> class X { / ... / };
X<int, "Studebaker"> x1; // error: string literal as template-argument
const char p[] = "Vivisectionist";
X<int,p> x2; // OK
-end note]
那么为什么下面的代码在所有编译器(gcc 4.7.2, MSVC-11.0, Comeau)中都给我一个错误?
template <const char* str>
void foo() {}
int main()
{
const char str[] = "str";
foo<str>();
}
倒带几行
14.3.2/1:一个常量表达式(5.19),指定具有静态存储时间和外部或内部链接的对象的地址。
注意,下面的修改是有效的:
template <const char* str>
void foo() {}
char str[] = "str";
int main() {
foo<str>();
}
相关文章:
- 如何使用Luacneneneba API正确读取字符串和表参数
- 如何使用字符串文字作为宏参数
- 如何将可变长度参数联接为字符串
- 如何使用字符串find_first_of缓冲区形式(size_t n 参数)
- 具有字符串化的可变参数宏的现代/通用方法
- C++ 构造函数参数:字符串、整数、整数、整数
- 当C 中的系统调用conconculables时,参数字符串中的字符损失
- 模板参数字符串与整数
- #define 参数字符串化,但宽字符串 L " instead of "
- std::getline 用于 ifstream,使用参数字符串或 char *
- 通过参数字符串化宏调用模板函数
- 可变参数字符串比较
- 为什么位集的构造函数有参数字符串::charT 零,字符串::charT one)
- c++中stdbind在带有参数(字符串)的函数中的用法
- 当使用字符变量作为参数(字符串转换为字符)时,Std::rename()文件将不起作用
- C/ c++预处理器中的宏参数字符串化为宽字符串字面值
- 如何比较Visual C++中的参数字符串
- C++错误:推断出参数'T'字符串与常量字符的冲突类型 *
- 传递参数字符串,其中包含空格和引号
- 函数参数字符串通过引用传递