考虑以下:
using vector_type = std::vector<int>;
using const_iterator = typename vector_type::const_iterator;
using const_reverse_iterator = typename vector_type::const_reverse_iterator;
using iterator = typename vector_type::iterator;
using reverse_iterator = typename vector_type::reverse_iterator;
int main()
{
static_assert(!std::is_assignable_v<iterator, const_iterator>); // passes
static_assert(!std::is_assignable_v<reverse_iterator, const_reverse_iterator>); // fails
static_assert(std::is_assignable_v<reverse_iterator, const_reverse_iterator>); // passes
}
Run Code Online (Sandbox Code Playgroud)
我可以检查分配iterator{} = const_iterator{}是无效的,但不能检查reverse_iterator{} = const_reverse_iterator{}具有此类型特征的分配.
此行为在gcc 9.0.0,clang 8.0.0和MSVC 19.00.23506中是一致的
这很不幸,因为实际情况是reverse_iterator{} = const_reverse_iterator{}实际上并没有使用任何上述编译器进行编译.
类型特征的这种行为意味着表达式
std::declval<reverse_iterator>() = std::declval<const_reverse_iterator>()
Run Code Online (Sandbox Code Playgroud)
根据[meta.unary.prop]很好地形成,这看起来与我自己在is_assignable类型特征上的尝试一致.