VS2022 C++20环境下自定义forward_iterator无法通过static_assert验证的问题求助
VS2022 C++20环境下自定义forward_iterator无法通过static_assert验证的问题求助
我最近在VS2022里基于C20标准实现自定义容器和迭代器,完全严格照着《Template Metaprogramming with C》(Marius Bancila著)里的API示例来写的,结果碰到了一个搞不懂的问题,想请大家帮忙分析下原因,或者给个修复思路。
我的代码结构大概是这样:
- 定义了模板类
template <typename Value, typename Key = std::string> class my_container - 配套的迭代器类
template<typename Value, typename Key> class my_iterator,按照forward iterator的要求来设计
我想用static_assert验证这个迭代器是否符合标准:
static_assert(std::forward_iterator<my_iterator<int, std::string>>);
结果验证失败了,就连更基础的input iterator断言也通不过:
static_assert(std::input_iterator<my_iterator<int, std::string>>);
下面是完整的编译错误信息:
Build started at 16:36... 1>------ Build started: Project: TestForwardIteratorConsole, Configuration: Debug x64 ------ 1>TestForwardIteratorConsole.cpp 1> ...\TestForwardIteratorConsole\TestForwardIteratorConsole.cpp(7,20): error C2607: static assertion failed 1> ...\TestForwardIteratorConsole\TestForwardIteratorConsole.cpp(7,20): 1> the concept 'std::input_iterator<my_iterator<int,std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>' evaluated to false 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include\xutility(984,59): 1> the concept 'std::indirectly_readable<my_iterator<int,std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>' evaluated to false 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include\xutility(898,31): 1> the concept 'std::_Indirectly_readable_impl<my_iterator<int,std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>' evaluated to false 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include\xutility(891,21): 1> the concept 'std::same_as<const int&,int&>' evaluated to false 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include\xutility(891,21): 1> 'const int &' and 'int &' are different types 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include\xutility(891,11): 1> the expression was resolved to a call to 'my_iterator<int,std::basic_string<char,std::char_traits<char>,std::allocator<char>>>::operator *' 1> ...\TestForwardIteratorConsole\MyIterator.h(174,21): 1> see declaration of 'my_iterator<int,std::basic_string<char,std::char_traits<char>,std::allocator<char>>>::operator *' 1>Done building project "TestForwardIteratorConsole.vcxproj" -- FAILED. ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== ========== Build completed at 16:36 and took 06,751 seconds ==========
让我困惑的是:如果把迭代器类里的operator*()注释掉,input iterator的断言居然能通过,但operator*()明明是forward iterator必须实现的方法啊。更奇怪的是,我去测试了书里配套的环形缓冲区迭代器示例代码,也碰到了完全一样的问题!这让我不禁怀疑是不是VS2022里的std::forward_iterator断言逻辑有问题?
之前有@康桓瑋和@Barry给了一些提示,指出了可能的问题点,但我还是没搞明白具体该怎么修复。
下面是我用来复现问题的简化测试代码(迭代器的operator*()在第180行被注释了):
// MyIterator templates and declarations #pragma once #include <string> #include <map> #include <iterator> template<typename Value, typename Key = std::string> class my_container { // 容器实现(仅用于测试,无实际业务逻辑) }; template<typename Value, typename Key> class my_iterator { public: using value_type = Value; using difference_type = std::ptrdiff_t; using pointer = Value*; using reference = Value&; using iterator_category = std::forward_iterator_tag; // 其他迭代器必需的方法实现(比如operator++、operator==等) // 注释掉这个operator*(),input_iterator断言能通过;放开则失败 // reference operator*() { // // 简化的返回逻辑 // return *some_pointer; // } }; // 测试断言 static_assert(std::input_iterator<my_iterator<int, std::string>>); static_assert(std::forward_iterator<my_iterator<int, std::string>>);
有没有大佬能帮我分析下问题出在哪,或者给个修复的方向?
内容来源于stack exchange
相关产品推荐
相关产品推荐

