Я хочу написать некоторую функцию, которая принимает строковый литерал - и только строковый литерал:
template <size_t N>
void foo(const char (&str)[N]);
К сожалению, это слишком экспансивно и будет соответствовать любому массиву char
- независимо от того, является ли он истинным строковым литералом. В то время как невозможно сказать разницу между ними во время компиляции - без, чтобы прибегнуть к требованию, чтобы вызывающая сторона обертывала литерал/массив - во время выполнения эти два массива будут находиться в совершенно разных местах в памяти:
foo("Hello"); // at 0x400f81
const char msg[] = {'1', '2', '3'};
foo(msg); // at 0x7fff3552767f
Есть ли способ узнать, где в памяти могут существовать строковые данные, чтобы я мог, по крайней мере, assert
, чтобы функция принимала только строковый литерал? (Использование gcc 4.7.3, но на самом деле решение для любого компилятора было бы замечательным).