Явное расщепление массива на указатель

Каков наиболее лаконичный и идиоматический способ явного преобразования массива в указатель?

Например, рассмотрим случай, когда вам нужно иметь возможность направлять 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

Источник: ledsshop.ru

Стиль жизни - Здоровье!