相关疑难解决方法(0)

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;
}
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++规范的一个奇怪的角落 - 有人能证实吗?

c++ g++ string-literals

13
推荐指数
1
解决办法
817
查看次数

标签 统计

c++ ×1

g++ ×1

string-literals ×1