【发布时间】:2020-07-16 19:39:54
【问题描述】:
为什么新的std::sentinel_for 概念要求标记类型为default_initializable(通过semiregular)?这不排除了一大类有用的哨兵类型,其中默认构造没有任何意义?
例子:
//Iterate over a string until given character or '\0' is found
class char_sentinel
{
public:
char_sentinel(char end) :
end_character(end)
{ }
friend bool operator==(const char* lhs, char_sentinel rhs)
{
return (*lhs == '\0') || (*lhs == rhs.end_character);
}
friend bool operator!=(const char* lhs, char_sentinel rhs) { ... }
friend bool operator==(char_sentinel lhs, const char* rhs) { ... }
friend bool operator!=(char_sentinel lhs, const char* rhs) { ... }
private:
char end_character;
};
我知道我可以添加一个初始化为 '\0' 的默认构造函数,但如果我认为这是对结构的滥用并想阻止它呢?
【问题讨论】:
-
重复链接中的解释仅将问题转移到“为什么不是所有迭代器都需要默认构造?”。为什么输入迭代器也不需要是默认可构造的?
-
我们也有人在 cpplang Slack 上提问,我不知道答案。关于
ostream_iterator的链接问题(它是一个迭代器而不是哨兵,并且它本身也不是哨兵因为 it isn't default-constructible)根本不是这个问题的重复。跨度> -
@Quuxplusone 更重要的是,它也不是哨兵,因为它没有(而且从来没有,与默认构造函数不同)相等。但是“为什么输出迭代器需要默认可构造”这个问题实际上与“为什么哨兵需要默认可构造”非常相似,并且具有相同的答案(除了我们删除了之前的限制)。
标签: c++ language-lawyer c++20 c++-standard-library c++-concepts