数组初始化器必须是初始化列表或字符串文字为什么?

时间:2014-12-14 18:34:47

标签: c++ c++14

为什么不能这样做?

constexpr auto foo()
{
    return "hello";
}

int main()
{
    // char s[] = foo();
    auto s2 = foo();
    const char* s3 = foo();
}

给出错误。 s2和s3都很好。

我认为这是可能的,但显然不是。

是的,我已经知道你不能这样做了。你们没有人在解释为什么你们不能这样做。

2 个答案:

答案 0 :(得分:3)

数组既没有复制构造函数也没有复制赋值运算符,函数可能没有数组的返回类型。

但是您可以返回对数组的引用。下面是一个示范程序

#include <iostream>

constexpr auto & foo()
{
    return "hello";
}

int main() 
{
    auto &s = foo();

    std::cout << sizeof( s ) << std::endl;

    return 0;
}

程序输出

6

这是字符串文字的大小。

答案 1 :(得分:1)

auto推断为char const*。正如编译器非常直接地告诉你的那样,char数组的初始化器必须是braced-init-lists(即{…})或字符串文字。

为什么返回类型被推导为指针而不是数组?你不能返回数组。这是不可能的,因为C ++数组中的无法复制 占位符返回类型是“使用函数调用的模板参数推导规则”推导出来的 并且相同的限制适用于数组作为函数参数,因此模板参数推导将推导出指针类型,[temp.deduct.call] / 2:

  

如果P不是参考类型:

     
      
  • 如果A是数组类型,则使用数组到指针标准转换(4.2)生成的指针类型代替A   类型扣除;
  •   

因此错误。您只需无法使用函数的返回值初始化数组。