我从一个应该使用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;
}
Run Code Online (Sandbox Code Playgroud)
产生结果:
Template const char array constructor
char* constructor
Run Code Online (Sandbox Code Playgroud)
在g ++上?令人惊讶的是,在从fn()生成返回值时,首先选择char*构造函数而不是const char数组构造函数.不可否认,有一个警告,"从字符串常量到'char*'的已弃用转换"
更令人惊讶的是,如果删除char*构造函数,则代码不会使用g ++进行编译.
它与clang一起工作(模板构造函数两次使用),这让我觉得这是一个编译器错误,但也许它只是C++规范的一个奇怪的角落 - 有人能证实吗?