I'm seeing some odd behaviour when returning a string literal from a function that should perform an implicit conversion with g++ (version 4.7.3). Can anyone explain why the following code:
#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;
}
produces the result:
Template const char array constructor
char* constructor
on g++? The surprising thing being that the char* constructor is chosen in preference to the const char array constructor when generating the return value from fn(). Admittedly there is a warning, "deprecated conversion from string constant to 'char*'"
Even more surprisingly if you remove the char* constructor then the code doesn't compile with g++.
It works as expected with clang (Template constructor used both times), which makes me think this is a compiler bug, but maybe it's just a weird corner of the C++ spec - could anyone confirm?
char*, it behaves the same way with other arrays too:const char foo[4] = {}; return foo;fails with "error: could not convert ‘(const char*)(& foo)’ from ‘const char*’ to ‘Test’"struct S { S(S(&)()); }; S f() { return f; }is accepted by clang, but gcc reports "error: could not convert ‘f’ from ‘S (*)()’ to ‘S’" A workaround could bereturn S(f);, or in your example,return Test("foo");