c -g处理返回的字符串字面值作为const char指针不是const char数组

当从使用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?令人惊讶的是,当从fn()生成返回值时,char *构造函数优先于const char数组构造函数.诚然,有一个警告,“不建议从字符串常量转换为”char *“”

更令人惊讶的是,如果你删除char *构造函数,那么代码不会用g编译.

它的工作原理与clang(模板构造函数使用两次),这使我认为这是一个编译器错误,但也许这只是C规范的一个奇怪的角落 – 谁可以确认?

最佳答案
看来这是一个bug,它影响了多个版本的gcc,这个版本一再被报告,最近大约一个月前就是最新的版本,4.8.2.见http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24666

转载注明原文:c -g处理返回的字符串字面值作为const char指针不是const char数组 - 代码日志