【问题标题】:How does C++ determine this should be a string_view?C++ 如何确定这应该是一个 string_view?
【发布时间】:2021-08-23 20:03:19
【问题描述】:

考虑以下代码:

#include <optional>
#include <string_view>

int main() {
    std::optional<std::string_view> opt { "abc" };
    std::cout << opt.value();

    return 0;
}

它编译并在运行时向控制台输出“abc”。为什么会编译? main 中的第一行代码应该是:

std::optional<std::string_view> { std::string_view { "abc" } };

编译器如何知道使用字面量调用 string_view 构造函数?这似乎不仅仅是我以前见过的类型推断。在这里,编译器似乎正在向我的源代码添加代码,即调用构造函数。

【问题讨论】:

    标签: c++ local auto type-deduction


    【解决方案1】:

    编译器如何知道使用字面量调用 string_view 构造函数?

    std::optional 有一个构造函数,其形式为

    template < class U = T >
    constexpr optional( U&& value );
    

    仅当T 可以从U 构造时才用于直接初始化底层对象,在这种情况下它可以使用std::string_view's

    constexpr basic_string_view(const CharT* s);
    

    构造函数。

    这似乎不仅仅是我以前见过的类型推断

    你告诉编译器你有一个std::optional&lt;std::string_view&gt;,所以它不需要确定你有什么类型的可选。它确实确定 U 将在构造函数中是什么,并认为这是一种可用于构造 std::string_view 的类型,因此它调用构造函数来执行此操作,因为它满足要求。

    【讨论】:

    • 感谢 Nathan 的明确回答。从我的例子来看,我似乎不只是初始化一个对象,但我只有一对大括号。我正在初始化可选的和底层的 string_view。初始化语法是否根据需要初始化尽可能多的对象?
    • @user2674487 您正在初始化可选项,并且在初始化程序上将可选项转发给被包装的对象以进行初始化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多