3

浏览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>在此示例中不会编译?

4

1 回答 1

1

我怀疑这是一个类似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

是什么让这个类在这个方面特别?

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

什么都没有,除了我们的决定char是一个角色,int而不是。(这正是我不得不写std::cout << str[0].c而不能写std::cout << stror的std::cout << str[0]原因,因为对于s 或者其他东西来说<<是重载的,但对于我自己的类型来说肯定不是。)char

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

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

我会改写为

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

这又导致了另一个问题:

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

我想不出一个。

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

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

于 2022-01-12T14:23:02.570 回答