c++ - 为什么basic_string_view不限于字符类型?

标签 c++ c++-concepts c++23

浏览 twitter我找到了这个 C++23 代码示例。

这是我的 adaptation of it, 使我感兴趣的更明显(我不关心回复中提到的悬空问题)。

#include <vector>
#include <string_view>
#include <iostream>
#include <type_traits>


int main() {
    std::vector v{84.72};
    std::basic_string_view sv = v;
    static_assert(std::is_same_v<decltype(sv), std::basic_string_view<double>>);
    const auto val = *std::begin(sv);
    std::cout << val;
}

我的问题是为什么 basic_string_view 上没有一些要求/概念约束?使其仅适用于 charish 类型,因此 basic_string_view<double>在这个例子中不会编译?

最佳答案

我怀疑这是一个 char - 类似类型:

struct Char {
    char c;
    Char() : c{} {}
    Char(char c) : c{c} {}
};

为什么它不起作用?的确如此

std::basic_string<Char> str{'a', 'b'}; // OK
std::cout << str[0].c << std::endl; // prints a
std::cout << str.length() << std::endl; // prints 2

是什么让这个类(class)如此特别?

struct Char {
    int c;
    Char() : c{} {}
    Char(int c) : c{c} {}
};

没什么,除了我们决定 char是一个字符并且int不是。 (这正是我必须写 std::cout << str[0].c 而不能写 std::cout << strstd::cout << str[0] 的原因,因为 <<char 和其他东西而重载,但肯定不是我自己的类型.)

因此,正如一些评论所暗示的那样,底线是一个反问题:

How would you define a "charish" type?

我会改写为

Can we encode the definiton of "sequence of char-like objects" in a concept?

这又引出了另一个问题:

What operations can you do only on a "sequence of char-like objects" that you can't do on all "sequences of non-char-like objects"?

我想不出一个。

因此,如果您想强制执行您提到的约束,您最终会明确列出 char , wchar ,以及一些 SFINAE 事物中的所有其他事物。

然后你不能将它用于任何其他类型。

关于c++ - 为什么basic_string_view不限于字符类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70682156/

相关文章:

c++ - ZeroMQ-发布/订阅延迟

c++ - 静态断言类型 A 可以从类型 B 构造

c++ - 为什么在 C++23 中分配_at_least()?

c++ - 通过 lambda 中的显式 this 参数访问捕获的变量

c++ - 检查类是否可流式传输的概念

c++ - 如何在 C++ 中按范围连接多个分隔符?

c++ - CUDA: __device__ and __global__ error: expected constructor, destructor, or type conversion before "unsigned"/"void"”

c++ - 查看核心转储

c# - 在 C# 中编写 C++ std::reverse 等效项的最接近方法是什么?

c++ - Range v3 中的 Readable 概念到底是什么?