![](/img/trans.png)
[英]Why does std::runtime_error::what() return const char* instead of std::string const&
[英]Why does “auto” declare strings as const char* instead of std::string?
我制作了一个模板,用于添加给出的数据。 如果我像这样使用它,编译器将in_1和in_2声明为const char *,并且代码不会编译。
#include <iostream>
using namespace std;
template <class T>
T addstuff(T part_1, T part_2){
return(part_1+part_2);
}
int main(int argc, char const *argv[])
{
auto in_1="Shut ";
auto in_2="up.";
cout<<addstuff(in_1, in_2)<<endl;
return 0;
}
如果我声明in_1和in_2 std :: string,它就像一个魅力。
为什么不能(或不)编译器自动声明这些字符串std :: string?
你不能“写”到你的auto变量的原因是它是一个const char *或const char [1],因为这是任何字符串常量的类型。
auto的要点是解决最简单的类型,它对于赋值类型“有效”。 编译器“不期待看到你对变量做了什么”,所以它不明白以后你会想要写入这个变量,并用它来存储一个字符串,所以std :: string会更有意义。
您可以使代码以多种不同的方式工作,这是一个有意义的方法:
std::string default_name = "";
auto name = default_name;
cin >> name;
因为字符串文字的类型为const char[N+1]
,而不是std::string
。
这只是语言的一个事实。
他们本可以做到这一点,以便auto
有一个字符串文字的特殊情况,但这将是不一致的,令人惊讶的,并且几乎没有什么好处。
如果使用字符串文字, auto
将按预期工作。
在C ++ 14,C ++ 17或C ++ 20中,您可以在引号后面放置一个s
,它将创建一个std::string
而不是const char*
string。
这可以与auto
一起使用来创建一个std::string
:
auto hello = "hello"s;
默认情况下不启用字符串文字。 启用字符串文字的一种方法是将以下内容放在源文件的顶部:
#include <string>
using namespace std::string_literals;
例如,此循环适用于std::string
(将s
添加到字符串文字中),但不适用于const char*
类型字符串文字:
for (auto &x : hello) {
std::cout << "letter: " << x << std::endl;
}
这是“”运算符的cppreference页面。
auto
会将变量声明为初始化它的表达式的编译时类型。
字符串文字的类型为const char*
,而不是std::string
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.