-1

一些(很多?)程序员被介绍给两者std::string_viewstd::string问自己:“为什么我可以将后者转换为前者,而不是反过来呢?”

问题的一部分在这里得到了回答:

为什么没有从 std::string_view 到 std::string 的隐式转换?

一个人可以喜欢或不喜欢的原因。但是 -显式构造函数呢?我在 cppreference.com的std::string构造函数页面上没有看到一个?

对有关隐式构造函数的问题的两个答案基本上都表明隐式构造函数会导致内存分配和内存复制,而程序员并不清楚这一点。好的,好吧,使用显式构造函数 - 程序员确实想要分配和复制。为什么不给他/她呢?

4

1 回答 1

3

tl; dr:它确实存在。

正如@Barry 和@StoryTeller 所指出的,这个构造函数实际上是存在的——尽管是通过使用模板;您只是没有注意到您链接到的 cppreference 页面上的“细则”:

template < class T >
explicit constexpr basic_string(
    const T& t,
    const Allocator& alloc = Allocator()
);

std::string这将从a构造一个std::string_view。为什么?因为它是什么:

隐式转换t为字符串视图sv,就像 by 一样std::basic_string_view<CharT, Traits> sv = t;,然后用 的内容初始化字符串sv,就像 by 一样std::basic_string(sv.data(), sv.size(), alloc)

对于以下具体情况T = std::string_view

template <>
explicit constexpr basic_string<std::string_view>(
    const std::string_view& t,
    const Allocator& alloc = Allocator()
);
于 2020-06-22T17:22:18.670 回答