为什么 std::vector 的字符串文字初始值设定项列表不能在 C++ 中创建 std::vector<std::string>?
Why can't a string literal initializer list for a std::vector create a std::vector<std::string> in C++?
在 C++ 中,如果我这样做:
std::vector words {"some","test","cases","here"};
谁能解释为什么 words
不是 std::vector<std::string>
类型的容器?
C++不是应该通过我给出的初始化列表来推导出类型吗?
如果 "some"、"test" 不是字符串文字,那么 std::string 文字是什么样的?
a string literal,与 "something"
一样,是一个 C 字符串。它创建一个具有静态存储持续时间的 const char[N]
,其中 N
是字符数加上空终止符。这意味着当你做
std::vector words {"some","test","cases","here"};
您所做的是创建一个 std::vector<const char*>
因为数组可以退化为指针。
如果您想要 std::vector<std::string>
,那么您需要的是使用 std::string
user defined literal。那看起来像
using namespace std::string_literals;
std::vector words {"some"s,"test"s,"cases"s,"here"s};
现在您实际上已经 std::string
编译器将使用它们来推断向量的类型。
在 C++ 中,如果我这样做:
std::vector words {"some","test","cases","here"};
谁能解释为什么
words
不是std::vector<std::string>
类型的容器?C++不是应该通过我给出的初始化列表来推导出类型吗?
如果 "some"、"test" 不是字符串文字,那么 std::string 文字是什么样的?
a string literal,与 "something"
一样,是一个 C 字符串。它创建一个具有静态存储持续时间的 const char[N]
,其中 N
是字符数加上空终止符。这意味着当你做
std::vector words {"some","test","cases","here"};
您所做的是创建一个 std::vector<const char*>
因为数组可以退化为指针。
如果您想要 std::vector<std::string>
,那么您需要的是使用 std::string
user defined literal。那看起来像
using namespace std::string_literals;
std::vector words {"some"s,"test"s,"cases"s,"here"s};
现在您实际上已经 std::string
编译器将使用它们来推断向量的类型。