![](/img/trans.png)
[英]Why does std::basic_string_view have two equality comparison operators?
[英]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 << str
或std::cout << str[0]
的原因,因为<<
对于char
s 或者其他东西来说是重载的,但对于我自己的类型来说肯定不是。)
因此,正如一些评论所暗示的那样,底线是一个反问题:
你会如何定义“魅力”类型?
我会改写为
我们可以在一个概念中编码“类似
char
的对象的序列”的定义吗?
这又导致了另一个问题:
您只能对“类似
char
的对象的序列”执行哪些操作,而不能对所有“类似char
的对象的序列”执行哪些操作?
我想不出一个。
因此,如果您想强制执行您提到的约束,您最终会在某些 SFINAE 事物中明确列出char
、 wchar
和所有其他约束。
然后你不能将它与任何其他类型一起使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.