【发布时间】:2009-04-20 05:21:59
【问题描述】:
我正在尝试玩花哨的游戏,它让 C++ 编译器在编译时合成常量字符串的哈希值。这可以让我用单个标识符替换字符串,从而大大节省代码大小和复杂性。
为了编程的清晰性和易用性,如果我可以在编译时检查和计算简单的内联字符串,例如“Hello”,它是指向编译时常量字符的编译时常量指针。
如果我可以在编译时索引这些,我可以制作一个模板元程序来做我想做的事。但尚不清楚 C++ 标准是否将 ct-constant 数组的 ct-constant 索引本身视为 ct-constant。
换个方式问,
const char v="Hello"[0];
是非常有效的 C++(和 C)。但是值 v 是编译时间常数吗?
我已经相信答案是否定的,但实际上一些编译器在没有任何警告的情况下接受它,更不用说错误了。例如,以下代码编译并运行,甚至没有来自英特尔 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!
}
然而,微软的编译器根本不会编译,给出一个合理连贯的错误信息,关于使用带有内部链接的对象的模板。
我怀疑我的问题的答案是“不,即使对具有常量索引的常量数组的任何数组引用在编译时也是常量”。这是否意味着英特尔编译器的成功执行是英特尔编译器中的一个错误?
【问题讨论】:
标签: c++ compiler-construction metaprogramming standards-compliance