Ответ 1
Я попытался представить это как ошибку для llvm bugzill. Ответ был:
Это ошибка GCC. См:
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1584
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).
Я попытался представить это как ошибку для llvm bugzill. Ответ был:
Это ошибка GCC. См:
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1584
Указатель на функцию не является указателем на объект, а говорящий о const
-ness указателя на функцию не имеет смысла в С++.
IMO g++ прав, потому что hex
квалифицируется как указатель на функцию, но не как const *
на что-либо.
В первом случае параметр шаблона не является "указателем", а "указателем на объект".
В С++ нет такого понятия, как общий "указатель"... у вас есть указатели на функцию, указатели на объект или указатель на члены. Каждый из трех имеет разные правила и несовместим с другими.
По правде говоря, нулевой указатель вызывает некоторую путаницу...