Подтвердить что ты не робот

Перегрузка функции шаблона clang++

g++ 4.8.1 и clang++ 3.4 дают разные результаты для следующего кода:

// simplified code from a Logger module
#include <iostream>

template<class T> void tf(const T*) {  // clang++ 
    std::cout << "void tf(const T*)\n"; 
}

template<class T> void tf(T) {  // g++
    std::cout << "void tf(T)\n"; 
}

int main(){ 
    typedef std::ios_base& (*ph)(std::ios_base&);
    ph p = std::hex;
    tf(p); // or just tf(std::hex)
}

Я не могу понять, какой вариант правильный (С++ 03).

4b9b3361

Ответ 2

Указатель на функцию не является указателем на объект, а говорящий о const -ness указателя на функцию не имеет смысла в С++.

IMO g++ прав, потому что hex квалифицируется как указатель на функцию, но не как const * на что-либо.

В первом случае параметр шаблона не является "указателем", а "указателем на объект".

В С++ нет такого понятия, как общий "указатель"... у вас есть указатели на функцию, указатели на объект или указатель на члены. Каждый из трех имеет разные правила и несовместим с другими.

По правде говоря, нулевой указатель вызывает некоторую путаницу...