为什么不能这样做?
constexpr auto foo()
{
return "hello";
}
int main()
{
// char s[] = foo();
auto s2 = foo();
const char* s3 = foo();
}
给出错误。 s2和s3都很好。
我认为这是可能的,但显然不是。
是的,我已经知道你不能这样做了。你们没有人在解释为什么你们不能这样做。
答案 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
类型扣除;
因此错误。您只需无法使用函数的返回值初始化数组。