Я пытаюсь играть в причудливые игры, в которых компилятор C++ синтезирует хеш-значения постоянных строк в compiletime. Это позволило бы мне заменить строку одним идентификатором, с огромной экономией в размере и сложности кода.Является ли константа константы compiletime константным массивом compiletime самой константой compiletime?
Для ясности и простоты программирования было бы замечательно, если бы я мог исследовать и вычислять в compiletime с помощью простых встроенных символов, таких как «Hello», которые являются постоянными указателями compileime для постоянных символов compiletime.
Если я могу указать их в compiletime, я могу создать метапрограмму шаблона, чтобы делать то, что я хочу. Но неясно, относится ли стандарт C++ к константе ct-константы массива ct-констант как константа ct-константа.
Спросил еще один способ,
const char v="Hello"[0];
вполне действительный C++ (и C). Но - это значение v константа времени компиляции?
Я уже считаю, что ответ отрицательный, но на практике некоторые компиляторы принимают его без какого-либо предупреждения, а тем более ошибки. Например, следующие компилируется и работает без единого предупреждения от компилятора C++ от Intel:
#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!
}
Однако компилятор от Microsoft не будут компилировать на всех, давая сообщение достаточно когерентные ошибок об использовании шаблона с объектом с внутренним связь.
Я подозреваю, что ответ на мой вопрос: «Нет, вы не можете считать, что ссылка на массив даже в постоянном массиве с постоянным индексом постоянна в compiletime». Означает ли это, что успешное выполнение компилятора Intel является ошибкой в компиляторе Intel?
Clever макрос хак использовать оператор stringize макрос charize сырые символы! Конечно, это не помогает при попытке использовать аргумент шаблона. Если, может быть, макрос стиля varargs (C99 ??) может удалить один символ, построить новый typedef и включить остальные аргументы var в качестве рекурсивного типа a-la Loki? – SPWorley