为什么“auto”将字符串声明为const char *而不是std :: string?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么“auto”将字符串声明为const char *而不是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*字符串。

这可以与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;                                                         
}

这是the ""s operator的cppreference页面。

另一答案

auto会将变量声明为初始化它的表达式的编译时类型。

字符串文字的类型为const char*,而不是std::string

以上是关于为什么“auto”将字符串声明为const char *而不是std :: string?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中auto,register,static,const,volatile的区别

为啥这个 const auto 变量在 range-for 循环中为类的 const 成员函数编译?

VB中const用法

const 和 const volatile 的区别

JS中的const命令你真懂它吗?

为啥 lambda auto& 参数选择 const 重载?