Я вижу некоторое нечетное поведение при возврате строкового литерала из функции, которая должна выполнять неявное преобразование с g++ (версия 4.7.3). Может кто-нибудь объяснить, почему следующий код:
#include <stdio.h>
class Test
{
public:
template <unsigned int N>
Test(const char (&foo)[N])
{
printf("Template const char array constructor\n");
}
Test(char* foo)
{
printf("char* constructor\n");
}
};
Test fn()
{
return "foo";
}
int main()
{
Test t("bar");
Test u = fn();
return 0;
}
дает результат:
Template const char array constructor
char* constructor
на g++? Удивительно, что конструктор char * предпочтителен конструктор массива const char при генерации возвращаемого значения из fn(). По общему признанию, существует предупреждение: "устаревшее преобразование из строковой константы в" char * "
Еще более удивительно, если вы удалите конструктор char *, тогда код не скомпилируется с g++.
Он работает, как и ожидалось, с clang (используемый конструктор шаблонов одновременно), что заставляет меня думать, что это ошибка компилятора, но, возможно, это просто странный угол спецификации С++ - кто-нибудь может подтвердить?