компиляторной черной магии) способа в C++17 отличить переданный в функцию строковый литерал от каким-либо образом получившего модификатор const фиксированного массива char fa[SZ]? Хочу сэкономить на strlen в предположении, что строковый литерал мне нужен весь, даже с нулем посередине. Но если пишу шаблонную функцию, где компилятор мне услужливо посчитает длину, то он не менее услужливо бросит в этот же шаблон константный массив с полной его длиной. А для него-то мне как раз больше подойдет перегрузка, где придется вызывать strlen.
Другими словами, надо, чтобы он выбрал func(const char(&val)[N]) {...}для аргумента "123", и func(const char *ptr) { size_t N = strlen(ptr); ...} для fa?
Так можно случайно обжечься, к примеру кто-то объявляет массив фиксированного размера, а потом вызывает твою функцию, а массив фиксированного размера не отличим от строкового литерала
В этом и суть, что не отличим, а хочется, чтобы был отличим. Много хочу, сломается ABI?
Скорее просто придется смириться, либо пробрасывать строки с помощью std::string_view
вы не сэкономите на strlen
Обсуждают сегодня