浏览 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 << str
或 std::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/