我正在尝试玩让 C++ 编译器在编译时合成常量字符串的哈希值的花哨游戏。这将让我用单个标识符替换字符串,从而大大节省代码大小和复杂性。
为了编程的清晰性和易用性,如果我可以在编译时使用简单的内联字符串(如“Hello”)检查和计算,那将是非常棒的,这些字符串是指向编译时常量字符的编译时常量指针。
如果我可以在编译时索引这些,我可以制作一个模板元程序来做我想做的事。但尚不清楚 C++ 标准是否将 ct-constant 数组的 ct-constant 索引本身视为 ct-constant。
换个方式问,
const char v="Hello"[0];
是非常有效的 C++(和 C)。但是va 的值是编译时间常数吗?
我已经相信答案是否定的,但实际上一些编译器在没有任何警告的情况下接受它,更不用说错误了。例如,下面的编译和运行甚至没有来自英特尔的 C++ 编译器的一个警告:
#include <iostream>
const char value="Hello"[0];
template<char c> void printMe()
{
std::cout << "Template Val=" << c << std::endl;
}
int main()
{
const char v='H';
printMe<'H'>();
printMe<v>();
printMe<value>(); // The tricky and interesting case!
}
然而,微软的编译器根本不会编译,给出一个合理连贯的错误信息,关于使用带有内部链接的对象的模板。
我怀疑我的问题的答案是“不,即使对具有常量索引的常量数组的任何数组引用在编译时也是常量”。这是否意味着英特尔编译器的成功执行是英特尔编译器中的一个错误?