繁体   English   中英

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

[英]Why is basic_string_view not limited to character types?

浏览twitter我发现了这个 C++23 代码示例。

这是我对它的改编,以使我感兴趣的内容更加明显(我不关心回复中提到的悬空问题)。

#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上没有一些要求/概念约束以使其仅适用于 char ish类型,所以在这个例子中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 s 或者其他东西来说是重载的,但对于我自己的类型来说肯定不是。)

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

你会如何定义“魅力”类型?

我会改写为

我们可以在一个概念中编码“类似char的对象的序列”的定义吗?

这又导致了另一个问题:

只能对“类似char的对象的序列”执行哪些操作,而不能对所有“类似char的对象的序列”执行哪些操作?

我想不出一个。

因此,如果您想强制执行您提到的约束,您最终会在某些 SFINAE 事物中明确列出charwchar和所有其他约束。

然后你不能将它与任何其他类型一起使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM