为什么不能在C ++中为std :: vector的字符串文字初始值设定项列表创建std :: vector <std :: string>?

Utk*_*pta 2 c++ template-argument-deduction c++17

在C ++中,如果我这样做:

std::vector words {"some","test","cases","here"};
Run Code Online (Sandbox Code Playgroud)
  • 谁能解释为什么words不是一种std::vector<std::string>容器?

  • C ++是否应该通过我提供的初始化列表来推断类型?

  • 如果“ some”,“ test”不是字符串文字,那么std :: string文字看起来像什么?

Nat*_*ica 9

一个字符串文字一样"something",是一个C-字符串。它创建一个const char[N]具有静态存储持续时间的,其中N是字符数加上一个空终止符。这意味着当你做

std::vector words {"some","test","cases","here"};
Run Code Online (Sandbox Code Playgroud)

您要做的是创建一个a,std::vector<const char*>因为数组可以衰减到指针。

如果您想要a,std::vector<std::string>那么您需要使用std::string用户定义的文字。看起来像

using namespace std::string_literals;
std::vector words {"some"s,"test"s,"cases"s,"here"s};
Run Code Online (Sandbox Code Playgroud)

现在您实际上拥有std::string,编译器将用来推断向量的类型。