Каков наиболее лаконичный и идиоматический способ явного преобразования массива в указатель?
Например, рассмотрим случай, когда вам нужно иметь возможность направлять SFINAE или явно указывать перегрузку:
template<typename T, std::size_t N> void foo(T(&x)[N]); template<typename T> void foo(T *x); // int x[2] = {0, 1}; foo(x);
Может быть, с унарным плюсом? — person mockinterface schedule 11.04.2014
Что ты спрашиваешь? Приведенный выше код не является двусмысленным. — person mockinterface schedule 11.04.2014
@juanchopanza Ты пробовал? Я согласен, что это странно, но оба являются точными совпадениями. — person mockinterface schedule 11.04.2014
@dyp Я пробовал. Первый вариант лучше подходит. Или мой компилятор (gcc 4.7.3) не работает? — person mockinterface schedule 11.04.2014
Clang++ и g++ coliru говорят, что это неоднозначно: coliru.stacked-crooked.com/a/078c26aeb1abb226</ а> — person mockinterface schedule 11.04.2014
Да, они неоднозначны. Я так и не удосужился изучить это подробнее,
здесь — person mockinterface schedule 11.04.2014
Другим вариантом был бы явный выбор шаблона… — person mockinterface schedule 11.04.2014
Вы можете избежать двусмысленности, определив второй шаблон как template<typename T> void foo(T * const& x);. При выводе аргумента для T больше не будет распада массива. — person mockinterface schedule 12.04.2014
@JohannesSchaub-litb В C++14 был введен окончательный стандартный способ: std::decay, см. мое последнее обновление — person mockinterface schedule 20.05.2014
Связано: Какова цель унарного оператора плюс? и что такое затухание массива?. — person mockinterface schedule 25.03.2015
Источник: